我正在摆弄模板元编程并尝试更好地理解它。我创建了以下简单的模板元函数。
template<typename T, T Value>
struct is_positive
{
static const bool value = (Value >= 0);
}
const bool is_positive_test_1 = is_positive<int32_t, 3>::value; //true
const bool is_positive_test_2 = is_positive<int32_t, 0>::value; //true
const bool is_positive_test_3 = is_positive<int32_t, -1>::value; //false
一切正常,正如预期的那样,但我想知道是否有一种方法可以消除指定Value
参数类型的需要,因此调用约定将是:
is_positive<1>::value
提前谢谢你。 :)
修改
我希望这不是只为int32_t
工作,而是float32_t
以及任何其他数字类型。例如,我希望is_positive<3.141f>::value
无效,而无需专门化模板。
答案 0 :(得分:4)
只能推导出功能模板参数,而不能推断出类模板参数。在C ++ 03中,您不能拥有编译时功能,但在C ++ 11中,您可以使用constexpr
:
template<typename T>
constexpr bool is_positive(T val) {
return val >= 0;
}
为了表明它是在编译时进行评估,下面将编译:
template<bool V>
struct compile_time_tester
{};
int main() {
compile_time_tester<is_positive(3.14)> foo;
return 0;
}
答案 1 :(得分:1)
一个好方法是给第一个参数一个默认值,以防它没有给出它:
template<typename T=int32_t, T Value>
所以你有:
template<typename T=int32_t, T Value>
struct is_positive
{
static const bool value = (Value >= 0);
}
const bool is_positive_test_1 = is_positive<3>::value; //true
const bool is_positive_test_2 = is_positive<0>::value; //true
const bool is_positive_test_3 = is_positive<-1>::value; //false
参考:http://www.cplusplus.com/doc/tutorial/templates/
更新:
您似乎还在寻找变量类型决策的自动方式。我的想法是动态类型(意味着参数的类型在运行时识别而不是在编译时识别)。许多语言使用动态类型(例如PHP
和Python)但C++
是一个静态类型语言,意味着您必须声明变量的类型(例如int i = 0;
),并且将在编译时为变量设置此类型。因此,您要求的内容无法在C++
中自动完成。