C++ template non-type parameter type deductionという質問の問題の解決策を見つけようとしました。これには、f を呼び出すテンプレート パラメーターは含まれませんが、暗黙的にテンプレート パラメーターの正しい型が選択されます。
constexprは、関数にコンパイル時の定数のみが含まれ、コンパイル時に評価されることを保証する必要があるため(少なくともそれが私が考えていることです)、この問題の解決策になると思いました。だから私はこれを思いついた:
template <class T, T VALUE> void f() {}
//first i tried this:
template <class T> auto get_f(T t) -> decltype( &f<T,t> ) { return f<T,t>; }
//second try:
template <class T> constexpr void (&get_f( T t ))() { return f<T,t>; }
int main()
{
get_f(10)(); //gets correct f and calls it
}
最初のバージョンでは、次のエラーが生成されます。
error: use of parameter 't' outside function body
末尾の戻り値の型の decltype ステートメントでのパラメーターの使用は問題ないはずなので、これは本当に紛らわしいですか?
2 番目のバージョンでは、次のエラーが生成されます。
error: invalid initialization of non-const reference of type 'void (&)()'
from an rvalue of type '<unresolved overloaded function type>'
私は完全f
にget_f
. を持っていない場合、この種のエラー メッセージが表示されることが予想されますconstexpr
。それで、私は何をしているのかconstexpr
、またはGCCのC ++ 0x実装にこの場合の欠陥がありますか?
GCC 4.6.2 を使用しています