条件模板专业化

时间:2015-09-02 19:26:53

标签: c++ templates c++11 sfinae

如果模板参数是可构造的,我如何为类模板提供默认的虚方法实现?如果它不可构造(至少使用默认构造函数),则该方法应保持抽象。

我的尝试是仅在模板参数可构造时才创建类专门化,如下所示:

#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’

为什么会出现此错误?什么是实现我的目标的更好方法?

0 个答案:

没有答案