如何使用 boost::enable_if 定义部分专用模板 class 的成员函数
How to define member function of partially specialized template class using boost::enable_if
我想请你帮忙定义部分特化的class成员函数...让代码解释更多:
我有一个通用的 class 声明:
template<typename GEAR_TYPE, typename ENABLER = void>
class PartiallySpecializedClass;
然后我尝试使用 boost::enable_if
部分专门化 class
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 );
};
如果我尝试在 class 声明本身中定义该方法,它工作正常。但是当我尝试在单独的 .cpp 文件中定义它们时,问题就来了:
template<typename GEAR_TYPE>
void PartiallySpecializedClass< /* WHAT TO PLACE HERE???? */ >::Test( void )
{
}
甚至可以在单独的 .cpp 文件中定义部分特化 class 的成员方法吗?
非常感谢任何愿意帮助我解决这个问题的人。我希望这可以帮助其他和我有同样噩梦的人:o)
此示例使用 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 可以简化语法
只是为了扩展已接受的答案,下面是您如何编写通用 class 的 class 定义:
template <class T, class Enable>
void A<T, Enable>::type>::f()
{
std::cout << "generic A::f()" << std::endl;
}
我想请你帮忙定义部分特化的class成员函数...让代码解释更多:
我有一个通用的 class 声明:
template<typename GEAR_TYPE, typename ENABLER = void>
class PartiallySpecializedClass;
然后我尝试使用 boost::enable_if
部分专门化 classtemplate<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 );
};
如果我尝试在 class 声明本身中定义该方法,它工作正常。但是当我尝试在单独的 .cpp 文件中定义它们时,问题就来了:
template<typename GEAR_TYPE>
void PartiallySpecializedClass< /* WHAT TO PLACE HERE???? */ >::Test( void )
{
}
甚至可以在单独的 .cpp 文件中定义部分特化 class 的成员方法吗?
非常感谢任何愿意帮助我解决这个问题的人。我希望这可以帮助其他和我有同样噩梦的人:o)
此示例使用 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 可以简化语法
只是为了扩展已接受的答案,下面是您如何编写通用 class 的 class 定义:
template <class T, class Enable>
void A<T, Enable>::type>::f()
{
std::cout << "generic A::f()" << std::endl;
}