6

考虑到类模板,可以使用类型特征和虚拟启动器模板参数为某些类型的组提供模板特化。我之前已经问过了

现在,对于函数模板,我需要同样的东西:即,我有一个模板函数,并且想要对一组类型进行专门化,例如,作为 class 子类型的所有类型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
}

但是,这不起作用,因为函数模板不允许部分特化。那么该怎么做呢?也许是类型特征作为类型的默认参数?但是代码看起来如何呢?

4

4 回答 4

7

重载:

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>()); }
于 2012-09-03T14:51:10.340 回答
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(); }
于 2012-09-03T14:54:08.890 回答
0

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

于 2012-09-03T14:51:19.430 回答
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";
}
于 2012-09-03T14:55:06.193 回答