2017-02-13 7 views
6

私は単純なことをしたいC++でlambdaをテンプレート引数として使用するには?これは動作しませんもちろん</p> <pre><code>void DoUntil(auto predicate = [] { return false; }); </code></pre> <p>- 私はテンプレート引数を使用する必要があります:

template <typename P> 
void DoUntil(P predicate = [] { return false; }); 

をしかし、この文はどちらか動作しません - クラン私は、引数のない関数呼び出しを行う場合

error: no matching function for call to …
note: candidate template ignored: couldn't infer template argument 'P'

が、何とかコンパイラはデフォルト引数からタイプを推測するために失敗します:エラーが発生します

int main() { DoUntil(); } 

std::function<>は何も使用しません。

問題には他に解決策がありますか?

+1

これは推論されないコンテキストです。 [cppreference](http://en.cppreference。com/w/cpp/language/template_argument_deduction)非推定コンテキスト。引数の減算が行われている呼び出しで使用されているデフォルト引数を持つ関数パラメータのパラメータ型で使用されるテンプレートパラメータ。 – felix

+0

なぜ 'std :: function'を使いたくないのですか? –

答えて

6

デフォルトの引数機能の代わりに関数のオーバーロードを使用します。テンプレート機能に加えて、引数を取らない非テンプレート機能作成:

void DoUntil() ; 

template <typename P> 
void DoUntil(P predicate) ; 

を引数なしのバージョンは、単にデフォルトの述語として使用するラムダとテンプレートのバージョンを呼び出すことができます

void DoUntil() { DoUntil([] { return false; }); } 

あなたの独創的なアプローチの問題点は、デフォルトの引数VALUを指定してデフォルトテンプレート特殊化を提供しようとしているということですデフォルトのテンプレートタイプを指定しません。 Ttは、デフォルト値があるにもかかわらず、デフォルトのタイプを持っていないためであってもラムダを介さずに、次のように動作しません。必要なのは何

template <typename T> 
void Foo(T t = 3); 

<typename T = int>を使用してTのデフォルトのタイプを指定することです。

WhiZTiMの答えに記載されているように、ラムダ関数を含むケースのデフォルトタイプは、decltypeを使用して推測する必要があります。もちろん、ラムダはコンパイラにしか知られていないユニークな型を持っているからです。

3

ラムダは、デフォルトのコンストラクタを持たない匿名型です(使用できる場合は、そのコピー/移動コンストラクタを使用できます)。あなたはラムダ道を行く必要がある場合は、行うことができます。むしろラムダと周りいじるしようとするよりも

namespace detail{ auto predicate = [] { return false; }; } 

template <typename P = decltype(detail::predicate)> 
void DoUntil(P pred = detail::predicate); 

を。カイルストランドansweredとして、より良いまだ

namespace detail{ 
    struct DefaultPredicate{ bool operator()() const { return false; } }; 
} 

template <typename P = detail::DefaultPredicate> 
void DoUntil(P predicate = P{}); 

または:あなたは古き良き道を行くことができます。

+0

名前空間スコープにラムダを置く場合は、暗黙的に静的になるように 'const'にしてください。 – ildjarn

+0

ああ、テンプレート引数が適切にデフォルト設定されていれば、デフォルト引数を指定するとうまくいくのだろうかと思っていました。優れた。 –

関連する問題