如何使用boost :: enable_if定义部分专用模板类的成员函数

时间:2015-12-29 20:33:11

标签: c++ boost enable-if

我想请求您帮助部分专门的类成员函数定义...让代码解释更多:

我有一个泛型类声明:

template<typename GEAR_TYPE, typename ENABLER = void>
class PartiallySpecializedClass;

然后我尝试使用boost :: enable_if

对该类进行部分特化
template<typename TYPE_LIST, typename QUERY_TYPE>
struct IsTypeInList
{
    typedef typename boost::mpl::find<TYPE_LIST, QUERY_TYPE>::type TypePos;
    typedef typename boost::mpl::end<TYPE_LIST>::type   Finish;
    typedef typename boost::mpl::not_<boost::is_same<TypePos, Finish> >::type type;
    typedef typename type::value_type value_type;

    static const bool value = type::value;
};

template<typename GEAR_TYPE>
class PartiallySpecializedClass<GEAR_TYPE, typename boost::enable_if<typename IsTypeInList<InvoluteToothTypes, GEAR_TYPE>::type >::type >
{
public:
     void Test( void );
};

如果我尝试在类声明本身中定义方法,它可以正常工作。但是当我尝试在单独的.cpp文件中定义它们时会出现问题:

template<typename GEAR_TYPE>
void PartiallySpecializedClass< /* WHAT TO PLACE HERE???? */ >::Test( void )
{
}

甚至可以在单独的.cpp文件中定义部分专用类的成员方法吗?

非常感谢给任何想要帮助我解决此主题的人。我希望这可能有助于其他人和我一样做噩梦:o)

2 个答案:

答案 0 :(得分:2)

此示例使用C ++ 11中的std::enable_if,它本质上是boost :: enable_if的标准化版本。

#include <iostream>
#include <type_traits>

// the partial specialization of A is enabled via a template parameter
template<class T, class Enable = void>
struct A {
    void f() {
            std::cout << "generic A::f()" << std::endl;
    }
}; // primary template

template<class T>
struct A<T, typename std::enable_if<std::is_floating_point<T>::value>::type> {
    void f();
}; // specialization for floating point types


template<class T>
void A<T, typename std::enable_if<std::is_floating_point<T>::value>::type>::f() {
    std::cout << "A<for floats>::f()" << std::endl;
}

int main(void) {
    A<int> ai;
    ai.f();
    A<float> af;
    af.f();
}

产生

generic A::f()
A<for floats>::f()

请注意,如果你可以使用C ++ 14,你的生活会变得更加花哨和愉悦,因为std :: enable_if_t在这一点上简化了语法

答案 1 :(得分:0)

仅是为了扩展已接受的答案,这是编写通用类的类外定义的方法:

template <class T, class Enable>
void A<T, Enable>::type>::f()
{
    std::cout << "generic A::f()" << std::endl;
}