函数模板:具有类型特征的不同特化

时间:2012-09-03 14:45:02

标签: c++ templates typetraits function-templates

考虑类模板,可以使用类型特征和虚拟启用模板参数为某些类型的组提供模板特化。我已经asked that earlier

现在,我需要对函数模板做同样的事情:即,我有一个模板函数,并希望对一组类型进行特化,例如,所有类型都是类X的子类型。我可以用这样的类型特征来表达这个:

std::enable_if<std::is_base_of<X, T>::value>::type

我想过这样做:

template <typename T, typename ENABLE = void>
void foo(){
    //Do something
}

template <typename T>
void foo<T,std::enable_if<std::is_base_of<A, T>::value>::type>(){
    //Do something different
}

但是,由于功能模板不允许部分特化,因此不起作用。那么怎么做呢?也许类型为trait的默认参数为type?但是代码怎么样呢?

4 个答案:

答案 0 :(得分:6)

重载:

void foo_impl(T, std::false_type);

void foo_impl(T, std::true_type);

foo(T t) { foo_impl(t, std::is_base_of<A, T>()); }

答案 1 :(得分:3)

最接近您要求的是enable_if返回类型:

template<typename T> typename std::enable_if<std::is_same<T, int>::value>::type foo();
template<typename T> typename std::enable_if<std::is_same<T, char>::value>::type foo();

但是,调度到辅助函数或类可能更具可读性和效率。

辅助功能:

template<typename T> void foo_helper(std::true_type);
template<typename T> void foo_helper(std::false_type);
template<typename T> void foo() { foo_helper(std::is_same<T, int>()); }

助手类:

template<typename T, bool = std::is_same<T, int>::value> struct foo_helper {};
template<typename T> struct foo_helper<T, true> { static void foo(); };
template<typename T> struct foo_helper<T, false> { static void foo(); };
template<typename T> void foo() { foo_helper<T>::foo(); }

答案 2 :(得分:0)

在类模板中执行实际的实现(部分特化等)并编写一个小的包装器模板函数,除了在类模板中调用静态函数之外什么都不做。

答案 3 :(得分:0)

尝试了一些事情,最后我自己想出了正确的语法 - 抱歉。我不知道enable_if有第二个参数。通过使用此参数和默认值,可以。

以下是答案

template<typename T>
void foo(typename std::enable_if<std::is_base_of<A, T>::value,int>::type ENABLER = 0){
    std::cout << "T is a subclass of A!";
}

template<typename T>
void foo(typename std::enable_if<!std::is_base_of<A, T>::value,int>::type ENABLER = 0){
    std::cout << "T is NOT a subclass of A";
}