2

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

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在不需要专门化模板的情况下有效。

4

2 回答 2

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;
}
于 2013-10-03T00:51:39.563 回答
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/

更新:

您似乎还在寻找一种自动的变量类型决策方式。我的想法是动态类型(这意味着参数的类型在运行时而不是在编译时被识别)。许多语言使用动态类型(例如PHPPython)但是C++是静态类型语言,这意味着你必须声明您的变量的类型(例如int i = 0;),并且此类型将在编译时为变量设置。因此,您所要求的不能在C++.

于 2013-10-03T00:33:26.297 回答