是否有更清洁("更少的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);
}
答案 0 :(得分:2)
有过载方式:
void foo(A& a) { printf("first\n"); }
void foo(B& b) { printf("first\n"); }
void foo(C& c) { printf("second\n"); }
void foo(D& d) { printf("second\n"); }
或避免代码重复
template <typename T> void print_first(T&) { printf("first\n"); }
template <typename T> void print_second(T&) { printf("second\n"); }
void foo(A& a) { print_first(a); }
void foo(B& b) { print_first(b); }
void foo(C& c) { print_second(c); }
void foo(D& d) { print_second(d); }
答案 1 :(得分:2)
为什么你不能只使用继承,例如:
#include <iostream>
template <size_t>
struct tag {};
struct A: tag<1>{ }; struct B: tag<1>{ };
struct C: tag<2>{ }; struct D: tag<2>{ };
void foo(tag<1>&) {
std::cout << "1" << std::endl;
}
void foo(tag<2>&) {
std::cout << "2" << std::endl;
}
int main() {
A a; B b; C c; D d;
foo(a); foo(b); foo(c); foo(d);
}
输出:
1
1
2
2
答案 2 :(得分:2)
少c ++ 11
以下代码根据修订版C ++ 98工作
它模拟了更多 C ++ 11-ish 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
。