有没有一种更简洁的方式(“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/