如果模板参数是可构造的,我如何为类模板提供默认的虚方法实现?如果它不可构造(至少使用默认构造函数),则该方法应保持抽象。
我的尝试是仅在模板参数可构造时才创建类专门化,如下所示:
#include <iostream>
#include <type_traits>
using namespace std;
struct ShouldNotBeAbstract {};
struct ShouldBeAbstract {
ShouldBeAbstract(int) {
}
};
template <typename T, typename = void>
struct Test {
virtual void method() = 0;
};
template <typename T>
struct Test<T, enable_if<is_constructible<T>::value>::type> {
virtual void method() {}
};
int main(int argc, char* argv[]) {
cout << "Should not be abstract: " << is_constructible<Test<ShouldNotBeAbstract> >::value << endl;
cout << "Should be abstract: " << is_constructible<Test<ShouldBeAbstract> >::value << endl;
return 0;
}
但是,使用g++ -std=c++11 test.cpp
编译时出现以下错误:
test_conditional_template_specialization.cpp:19:62: error: type/value mismatch at argument 3 in template parameter list for ‘template<class T, class P, class> struct Test’
struct Test<T, P, enable_if<is_constructible<T>::value>::type> {
^
test_conditional_template_specialization.cpp:19:62: error: expected a type, got ‘std::enable_if<std::is_constructible<T>::value>::type’
为什么会出现此错误?什么是实现我的目标的更好方法?