2017-01-05 11 views
3

C++でテンプレートに関連する条件付き戻り型を使用します。 C++ 11、14および17プレビューは私の環境で利用できます。テンプレート付き条件付き戻り型

私はプログラミングが初めてではありませんが、私はC++を初め、一部の機能と混同しています。

私は何を達成したいことは次のとおりです。テンプレートは、私の戻り値の型がint64_tなりますint32_tある場合

int16_tint32_tint8_tint16_tを返します返されます。

実際に私は両方のための汎用テンプレートを使用しています:

template <class T, class T2> 
static T2 Foo(T bar1, T bar2) { //do something } 

int64_t x = Foo<uint32_t, uint64_t>(555555, 666666); 

私は唯一のパラメータの種類を入力することによって、これはもう少し現実的なようにしたいと思います。

int64_t x = Foo<uint32_t>(555555, 666666); 
int32_t x = Foo<uint16_t>(12000, 13000; 
int16_t x = Foo<uint8_t>(88, 99); 

私はstd::conditionalでそれを実装しようとした:

template<typename OtherType, 
     typename T = typename std::conditional<(sizeof(Type) <= 
     sizeof(OtherType)), 
     OtherType, Type>::type> 

私が過負荷とクレイジーなアイデアを使用して開いています。

+1

を望んで戻り値の型を取得するには、コンパイル時のマップを試みることができますか?ちょうどオーバーロード –

+0

@MooingDuck私は彼がすべてのオーバーロードのために同じボディを繰り返すことを望んでいないと思う。さもなければ実際にテンプレートを使うのは意味がありません。 – skypjack

答えて

6

C++でそれを行う慣用方法は、形質を使用しています。一例として、

template <class T> 
static typename foo_ret<T>::type Foo(T bar1, T bar2) {}; 

そして、それは次のように要求されたとして、あなたは、それを呼び出すことができます:

template<typename> struct foo_ret; 
template<> struct foo_ret<uint32_t> { using type = uint64_t; }; 
template<> struct foo_ret<uint16_t> { using type = uint32_t; }; 
// And so on... 

戻り値の型のテンプレートパラメータがさえ、もはや今必要とされない

int64_t x = Foo<uint32_t>(555555, 666666); 

または、希望する場合はコンパイラにTを推測させます。

+1

大変ありがとうございます。私はこれをずっとずっとずっとやり遂げる方法を模索していました。現在のプロジェクトでコードの20%を単純化しました:) – Lizi

+0

@Liziようこそ。形質は広く用いられている。それは彼らに自信を持っているだけの問題です。 ;-) – skypjack

1

あなたは、このためのテンプレートを使用するなぜあなたは

typedef boost::mpl::map< 
    boost::mpl::pair<uint32_t,uint64_t>, 
    boost::mpl::pair<uint16_t,uint32_t>, 
    boost::mpl::pair<uint8_t,uint16_t> 
> type_map_t; 

template <typename T> 
typename boost::mpl::at<type_map_t,T>::type Foo(T bar1, T bar2) {} 
+1

この回答も同様に機能しますが、ブーストに依存しています。共有のおかげで、それはいくつかの選択肢を持っていることは常に良いです:) – Lizi