8

引数のconst参照を持つ可変的なテンプレート関数を特化する方法はありますか?const参照を使用したVariadicテンプレートの特殊化

例:宣言const Test&引数で関数fooを呼び出すとき

template<typename T, typename... Args> 
T foo(Args... args) = delete; 

template<> int foo(int a, const char* str, const Test& t) { .... } // Fails to compile 
//template<> int foo(int a, const char* str, Test) { .... } // Ok 

int main() { 

    auto i = foo<int>(10, "test string!", t); 
    return 0; 
} 

、コンパイラは削除された機能に特化した機能とフォールバックを見るために失敗します。

error: use of deleted function ‘T foo(Args ...) [with T = int; Args = {int, const char*, Test}]’ 
    auto i = foo<int>(10, "test string!", t); 




上記のコードのコンパイル引数からconst参照を削除しても問題ありません。私は間違って何をしていますか?

コードは、主テンプレートは、あなたの通話に推論テンプレート引数がintconst char*、およびTest、ないconst Test&あるため。これはhere

答えて

3

自動テンプレート控除は、あなたはそれが最後のテンプレートパラメータを設定することを推測するのに十分にスマートではありませんTestの代わりにconst Test&です。より正確に型減算は常に型からcv修飾子を削除します。

あなたはここに新しい明示的なテンプレートのインスタンス化:もちろん

auto i = foo<int, int, const char *, const Test&>(10, "test string!", t); 
+0

、私は完全に明示的なインスタンスを忘れてしまいました。ご回答有難うございます! – Bected

7

を見つけることができますつまり、テンプレートの引数がパラメータと一致しないため、特殊化は使用されません。

あなたの最も簡単なオプションは、個別の過負荷ではなく、専門性を提供することです:

template <typename T> 
T foo(int a, const char* str, const Test& t) { /*...*/; } 

Live demo

関連する問題