1

改天,另一个模板元编程实验出错了。我正在尝试制作一个is_greater_than模板,该模板将采用两个整数值NMtype T

template<typename T, T N, T M>
struct is_greater_than<void, N, M>;

template<typename T = std::enable_if<std::is_integral<T>::value, T>::value, T N, T M>
struct is_greater_than<T, N, M>
{
    static const bool value = N > M;
};

尽我所能,我似乎无法让它发挥作用。尝试编译它会产生 112 个编译器错误。我在这里有一个 ideone 小提琴:http: //ideone.com/ch1j7b

我在这里做错了什么?任何帮助,将不胜感激!

4

3 回答 3

5

您的用法std::enable_if是错误的,它应该是一个单独的模板参数(可能未命名):

#include <iostream>
#include <type_traits>

template<typename T, T N, T M,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
struct is_greater_than:
    public std::integral_constant<bool, (N > M)>::type
{
};

int main()
{
    std::cout << is_greater_than<int, 1, 2>::value
              << is_greater_than<int, 1, 1>::value
              << is_greater_than<int, 2, 1>::value;
}

请注意,我从std::integral_constant这里继承,它将根据它的第二个参数为我们定义valueandtype成员(需要括号N > M)。

于 2013-10-04T08:25:20.263 回答
3

尝试这个:

template<typename T, T N, T M, typename enable = void>
struct is_greater_than;

template<typename T, T N, T M>
struct is_greater_than<T,N,M, 
       typename std::enable_if<std::is_integral<T>::value>::type>
{
    static const bool value = N > M;
};

int main()
{
    bool a = is_greater_than<int, 11, 10>::value;

    cout << boolalpha << a << endl;
}

输出:

真的

实时代码

于 2013-10-04T08:14:42.067 回答
1

这在 VS2010 中编译得很好:

template<typename T, T M, T N>
struct is_greater_than;

template<typename T = std::enable_if< std::is_integral<T>::value, T >::value, T M = T(), T N = T()>
struct is_greater_than {
    static const bool value = M > N;
};

您可以使用以下方法对其进行测试:

std::cout << is_greater_than<int,4,2>::value << std::endl;
std::cout << is_greater_than<std::string,"a","B">::value << std::endl;
于 2013-10-04T08:23:58.820 回答