为4种类型选择2个模板功能之一

时间:2016-07-05 12:20:46

标签: c++ templates c++11

是否有更清洁("更少的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);
}

3 个答案:

答案 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