2011-07-18 24 views
8

この仕事をやろうとしているI'am:C++テンプレート非型パラメータの型推論

template < typename T, T VALUE > 
void   f() 
{ 
    /* ... */ 
} 

int    main() 
{ 
    f<10>(); // implicit deduction of [ T = int ] ?? 
    return (0); 
} 

目的ははるかに複雑なテンプレートを簡素化することです。

多くの検索の後で、私はC++ 0xでそれを行う方法がないので、stackoverflowが私の最後の手段です。可能なTのすべての種類を指定せずに

  • ...
  • 私はグラムC++ 0xのが、とてもセクシーなものが許可されている++にしています。
+0

'10'は実際にはtypenameではありません。また、C++は、第2のテンプレート引数 'T'に特定の整数型を許可します。そこで最大の利用可能なタイプを使ってみませんか? –

答えて

5

C++ 0xはdecltype()を紹介します。これはまさにあなたが望むものです。

int main() 
{ 
    f<decltype(10), 10>(); // will become f<int, 10>(); 
    return 0; 
} 
2

私はあなたがそうすることはできないと考えています。コンパイラにタイプがあることを単に伝える必要があります。私は考えることができる最も近いものは、このようなものである:かなり何でどちらも

template<size_t x> 
void f() { 

} 

f<10>(); 

:それを超えて

template <class T> 
void f(T x) { 
    // do something with x 
} 

f(10); 

、私はあなたが少しだけを想定し、このような何かを行うことができたとしあなたが定数を渡しているので、まともなコンパイラは、このコンパイル時に多くを作ることができるはずです。

達成しようとしていることを詳しく説明できますか?非整数型は許されるでしょうか?単純化しようとしているより複雑なテンプレートを表示してみませんか?

5

C++の構造体/クラスの自動テンプレート控除はありません。何あなたがが行うことができますが、このような何か(!警告、テストされていない)である:

#define F(value) f<decltype(value), value> 

template < typename T, T VALUE > 
void   f() 
{ 
    /* ... */ 
} 

int    main() 
{ 
    F(10)(); 
    return (0); 
} 

これは、テンプレートのみのコードのようにきれいではありませんが、それが何をするかは明らかだし、あなた自身を繰り返すの負担を避けることができます。非C++ 0xコンパイラで動作する必要がある場合は、decltypeの代わりにBoost.Typeofを使用できます。

関連する問題