2016-04-14 16 views
-2

は次のように少し見えます(コンパイル時に)コードを生成する方法はあります:選択機能

T Func(T t){ 
    if (sizeof(t) == 2){ 
     return X(t); 
    } 
    else if(sizeof(t) == 4){ 
     return Y(t); 
    } 
} 

(TはINT32またはINT16のいずれかです。)

Func(_myInt) 

を、コードはちょうどX(_myInt)またはY(_myInt)のいずれかにまでコンパイルされます:実行時にだから私は呼び出すことができます。

+6

についての記事を読むまで、[テンプレート] (http://www.tutorialspoint.com/cplusplus/cpp_templates.htm)。 –

+0

@EdHeal、ここにテンプレートは必要ありません。 – SergeyA

答えて

7

はい。タグディスパッチすることにより、

X Func(int32_t t) { 
    return X(t); 
} 

Y Func(int16_t t) { 
    return Y(t); 
} 
+0

それを簡単に、愚かに保つ。 +1 –

4

:完全性については

template <typename T> 
auto Func_impl(T t, std::integral_constant<std::size_t, 2>){ 
    return X(t); 
} 

template <typename T> 
auto Func_impl(T t, std::integral_constant<std::size_t, 4>){ 
    return Y(t); 
} 

template <typename T> 
auto Func(T t){ 
    return Func_impl(T, std::integral_constant<std::size_t, sizeof(T)>{}); 
} 
+0

あなたはここにタグを派遣する必要はありません! int32_tとint16_tの単純なオーバーロードは可能です! – SergeyA

+0

また、常にテンプレートにXまたはYを追加することもできます。 'auto wVar = Func (123);'これは、呼び出し元 – Ceros

+0

@ KerrekSBに対する責任感を追加するものです。 Quoting OP: 'Tはint32またはint16のいずれかです。あなたのデモでは、unsigned intはどこから来ますか? – SergeyA

0

、あなただけの絶対的な大きさに派遣したかっただけの場合には、enable_ifもあります:

#include <utility> 
#include <cstdint> 

template <typename T, std::enable_if_t<sizeof(T) == 2>* = nullptr> 
auto Func(T t){ 

} 

template <typename T, std::enable_if_t<sizeof(T) == 4>* = nullptr> 
auto Func(T t){ 

} 

int main() 
{ 
    Func(std::uint16_t(10)); 
    Func(std::uint32_t(10)); 
} 
関連する問題