Passing different lambdas to function template in c++と似た問題がありましたが、ラムダの代わりにstd::bind
で作成されたラッパーを使用しています。std :: bindの結果をstd :: functionに渡す "overloads"
私はstd::function
の異なる形態をとる方法Add
の2つのオーバーロードがあります。
template<typename T>
struct Value
{
T value;
};
template <typename T>
void Add(Value<T> &value, function<bool()> predicate)
{
}
template <typename T>
void Add(Value<T> &value, block_deduction<function<bool(const Value<T> &)>> predicate)
{
}
これは今ラムダと正常に動作しますが、std::bind
で結合ファンクタで失敗します。
struct Predicates
{
bool Predicate0() { return true; }
bool Predicate1(const Value<int> &) { return true; }
};
Predicates p;
Add(i, std::bind(&Predicates::Predicate0, &p));
は
で失敗エラーC2668: '追加':オーバーオールへのあいまいな呼び出しDED機能
と
Add(i, std::bind(&Predicates::Predicate1, &p, _1));
は静的アサート(のVisual C++ 2015、アップデート3)で失敗します。境界
のうち
タプルインデックスが方法はありますラムダとバインドされたファンクタの両方で動作させるには? SFINAEを使用して
is_bindable_expression
に基づいて個々のオーバーロードを有効にし、引数の型をチェックすると思いますが、私はそれをまとめません。
'std :: bind(&Predicates :: Predicate0、&p)()'と 'std :: bind(&Predicates :: Predicate0、&p)(値 {})'は有効です。 (後者の場合、引数 'Value {}'は無視されます)。これは 'std :: bind'の機能です。 –
cpplearner
あなたは過負荷を悪用しています。 "この引数でインスタンスを呼び出すことができる"または "他の引数で呼び出すことができるインスタンス"のプロパティを満たす型の共通部分は空ではありません。 – milleniumbug