2016-07-12 16 views
3

このテンプレート宣言を特化することが可能です:C++可変長引数テンプレートの特殊化(およびstatic_assert)

template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) { 
    static_assert(false); 
} 

私のようないくつか試してみました:

template <> int Foo<int>(float args) { 
    return 42; 
} 

を...しかし、私はいつもヒット静的にアサートしてみてください:

auto value = Foo<int>(1.5f); 

正しい構文は何ですか?

+0

多分それはあなたのコンパイラがちょうどこの答えのように、それをサポートしていないということだけだ。http://stackoverflow.com/questions/を7767202/template-specialization-with-variadic-templates?rq = 1? – Louen

+0

どのコンパイラを使用しますか? ClangとMSVCはあなたのコードをコンパイルし、 'value'は42を保持します。 –

答えて

3

のようなものを使用してください。

あなたはあなたのケースで= delete使用することができます:

template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) = delete; 

template <> int Foo(float) {return 42;} 

Demo

+0

'template TYPE Foo(ARGS ... args);'この場合は十分ですか? – skypjack

+1

@skypjack:リンクエラーですが、 '= delete'でコンパイルエラーが発生する可能性があります。 – Jarod42

+0

ありがとうございました。 – skypjack

6

インスタンス化されていない限り有効なテンプレートは作成できません。それは抵触標準で以下のルールを実行します:

有効な分業が テンプレートに対して生成されないことができ、かつそのテンプレートがインスタンス化されていない場合は、テンプレートが悪い形成され、何の診断 は必要ありません。一方

、それはあなたがそのような場合には、そのような

static_assert(sizeof(TYPE) != sizeof(int)); 

として体内で何かがあった場合、テンプレートが有効であり、あなたのコードは、明示的な特殊以来、コンパイルされます罰金だろう実際にはプライマリテンプレートの代わりに使用されます。 http://coliru.stacked-crooked.com/a/238b979fd10c62c0

-2

静的アサートはテンプレートに依存しないため、常に起動します。 static_assertが起動する必要がありますので、falseが非鋳型依存性である、状態として

template <class TYPE, class... ARGS> TYPE Foo(ARGS... args) { 
    static_assert(sizeof(TYPE) != sizeof(TYPE)); 
} 
+0

これはコンパイラが現在それを診断していなくても同じです。 –

+0

@TC:それは正しく診断されます - 失敗した 'static_assert'の正しい診断はエラーです...標準状態で' static_assert'が失敗したコンパイルの段階は、依存しない式のテンプレート定義にあります。従属式のインスタンス化。インスタンス化時にのみ 'static_assert'を起動させたい場合は、条件自体がテンプレート引数によって影響されない場合でも、それを依存させてください。 – Dani

+0

このテンプレートの有効な特殊化を生成できないため、コンパイラは定義時にこれを診断することができます。この見積もりはBrianの答えです。 –

関連する問題