2017-03-13 30 views
0

私には今すぐ特定の型の値を返すことができる関数があります。それは次のようになります。このテンプレート関数コンパイル時の戻り型なし引数

template<typename T> 
T getNullValue(){ 
    if(std::is_same<T,long long>::value){ 
     return NULL_LONG; 
    }else if(std::is_same<T,double>::value){ 
     return NULL_DOUBLE; 
    } 

} 

これは動作しますが、私は時間をコンパイルするとは対照的に、実行時に解決し、それを好きではないが、これは私が、私はそれが私ができるようにすることができますどのように

double x = getNullValue<double>(); 
long long y = getNullValue<long long>(); 

を行うことができます実行時に解決する必要なしに返すものに応じて、異なるバージョンのgetNullValueをオーバーロードするだけです。

getNullValue<type i need>(); 
+0

このコードは最適化してコンパイルすると最適です。あなたは "エレガントな"テンプレートのオーバーロードを行うことができますが、コードをもっと複雑にする必要があります。 –

+0

簡単な答えは 'if constexpr'で、それ以外は変更する必要はありません。 – chris

+0

私は "constexpr(std :: is_same ....)"を実行すると、コンパイル時に解決されますか? – flips

答えて

1

テンプレートの専門化はうまくやるべきです。最適化コンパイラは、はこれを単純な代入に変換する必要があります。

// getNullValue.hpp : 

template <class T> 
T getNullValue() { 
    return 0; 
} 

// remember to declare specialization in header or strange linking errors may occur 
template <> long long getNullValue<long long>() 
template <> double getNullValue<double>() 


// getNullValue.cpp: 

template <> long long getNullValue<long long>() { 
    return NULL_LONG; 
} 
template <> double getNullValue<double>() { 
    return NULL_DOUBLE; 
} 

int main() { 
    double x = getNullValue<double>(); 
    long long y = getNullValue<long long>(); 
} 

詳細については、http://en.cppreference.com/w/cpp/language/template_specializationを参照してください。

+0

ありがとう、それは私が必要なものです! – flips

関連する問題