有没有一种更简洁的方式(“less c++ 11”),可以根据多种类型选择本示例中要使用的模板函数。我只想拥有2个函数,我可以使用额外的2个或4个函数重载或调用实现。

struct A{}; struct B{}; struct C{}; struct D{};

template <typename T>
typename std::enable_if<std::is_same<T, A>::value or std::is_same<T, B>::value, void>::type
foo(T& t)
{
    printf("first\n");
}

template <typename T>
typename std::enable_if<std::is_same<T, C>::value or std::is_same<T, D>::value, void>::type
foo(T& t)
{
    printf("second\n");
}

int main()
{
  A a; B b; C c; D d;
  foo(a); foo(b); foo(c); foo(d);
}

最佳答案



下面的代码与版本C++ 98兼容。
它模拟了更多C++ 11风格的std::enable_if,仅此而已。

#include<cstdio>

struct A{}; struct B{}; struct C{}; struct D{};

template<typename> struct R1;
template<> struct R1<A> { typedef void type; };
template<> struct R1<B> { typedef void type; };

template<typename> struct R2;
template<> struct R2<C> { typedef void type; };
template<> struct R2<D> { typedef void type; };

template <typename T>
typename R1<T>::type foo(T& t)
{
    printf("first\n");
}

template <typename T>
typename R2<T>::type foo(T& t)
{
    printf("second\n");
}

int main()
{
    A a; B b; C c; D d;
    foo(a); foo(b); foo(c); foo(d);
}



老实说,我发现C++ 11清洁器带有using声明和std::enable_if

关于c++ - 从4种类型的2种模板功能中选择一种,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38203325/

10-11 18:01