2016-09-05 34 views
1

テンプレートパラメータ(例えば、効率的理由など)として値を取得するはずの関数を記述したいと考えていますが、パラメータの型を事前に知らない期待している。不明な型のC++テンプレート引数

template<typename T, T val> 
func() { cout << val; } 

としてそれを実現することが可能であることはしかし、それは

func<int, 5>() 

はそれがS。T. funcを書き換えることが可能であるような関数を呼び出すことが楽しいではありません次のように呼び出すことができますか?

func<5>() 
+1

「auto」タイプで動作する可能性があります。 –

+2

http://open-std.org/JTC1/SC22/WG21/docs/papers/2016/p0127r2.html –

+2

なぜテンプレートではないのですか? constexpr void func(T val){} 'を呼び出し、それを' f(5 ) '? – skypjack

答えて

2

ほとんどがあなたの実際の機能に依存ソリューションが、それは次のように定義することです:

template<typename T> 
constexpr void func(T val) { } 

その後f(5)としてそれを呼び出すと、関数自体のパラメータから推定テンプレートパラメータを持っています。

それ以外の場合、C++ 14では、パターンtemplate<typename T, T value>の使用を避けることはできません。
標準テンプレートライブラリで使用されているのと同じパターンです。例としてstd::integral_constantの定義を参照してください。で

using IntS = S<int>; 
// .... 
IntS::func<5>(); 

:あなたはこのような何かを行うことができ

template<typename T> 
struct S { 
    template<T value> 
    static void func() {} 
}; 

緩和するが(多分)定型文を例として、構造体の使用に基づいており、可能な解決策

template<auto value> 
void func() {} 

これを呼び出すことができます。それは次のように今後の改訂C++ 17には、あなたはそれを行うには管理しますdをf<5>()とすると、それはあなたが探しているものです。

関連する問題