模板参数类型扣除

时间:2013-10-03 00:30:43

标签: c++ templates

我正在摆弄模板元编程并尝试更好地理解它。我创建了以下简单的模板元函数。

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无效,而无需专门化模板。

2 个答案:

答案 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++中自动完成。