私はパラメータとしてstd::function
を取る関数を持っています。しかし、渡される関数が渡されたパラメータを変更することを許可されないようにしたい。lambdaをstd :: functionに変換する際にconst-correctnessを適用する
はここで機能の簡易版です(T
は、および通常は、参照できることに注意してください):
template <class T>
void Bar(std::function<void(std::add_const_t<T>)> func)
{
// ...
}
悪い用法:
私はその使用を許可しないようにしたいBar<int&>([](int&) { /* Do nasty stuff! */ }); /* A-OK! */
、しかし、このコードは完璧にコンパイルされますが、私はそうすべきではないと感じています。 (ASすべきでない)
void Bar(std::function<void(const int&)> func)
{
// ...
}
次に、この用法はコンパイルされないでしょう:
Bar([](int&) { /* Do nasty stuff! */ }); /* Error C2664 */
どのように私はすなわち、テンプレートパラメータを取り除く場合
興味深いのは、あります私はこれを強制し、テンプレートパラメータを保持することはできますか?
注 'のstd :: add_const_tを' '' int型&です。 –
aschepler
@aschepler私はドキュメントでもそれを見ました。だから私はハッキーなバージョンをやってみました: 'const T'、私は' const int& 'に推論すると思っていました。しかし、いいえ。 'std :: add_const_t'を 'const T'に置き換えても、それはまだうまくコンパイルされます。 –
Zeenobit
@Zeenobit:テンプレートはマクロではありません。これは 'typedef int & T; T const ref;より似ています; - ' ref'は 'int&'になります。また、ポインタと比較する: 'typedef int * T; T const ptr'は 'int const *'ではなく 'int * const'を取得します。 – MSalters