2017-03-13 127 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

简单的答案是'如果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

相关问题