如何子类化由特征选择的超类?

时间:2016-11-10 19:39:58

标签: c++ templates inheritance

我有一个类的模板(我们称之为A),它应该是其他类(B或C)之一的子类,具体取决于我的自定义特征结构中的条件编译时间。我附加了一个重现行为的片段。

$(document).on('click','.enable',function(){
    $(this).attr('disabled',false);
    // Possibly do the form submit here...whatever I get to work
});

如果我这样离开(硬编码A作为超类),一切正常。但是,一旦我用注释掉的行替换类定义,我就会收到以下错误消息:

#include <type_traits>

template<typename T>
class cls_template {
public:
  using method_arg_type = T;
  virtual void method(method_arg_type) = 0;
};

using A = cls_template<float>;
using B = cls_template<int>;

template<typename T>
struct traits {
  using cls = std::conditional<std::is_floating_point<T>::value, A, B>;
};

//class C : public traits<float>::cls {
class C : public A {
public:
  virtual void method(method_arg_type arg) {};
};

int main() {
  A *a = new C();
}

为什么test.cpp:21:27: error: unknown type name 'method_arg_type' virtual void method(method_arg_type arg) {}; ^ test.cpp:25:10: error: cannot initialize a variable of type 'A *' (aka 'cls_template<float> *') with an rvalue of type 'C *' A *a = new C(); ^ ~~~~~~~ 不再定义?为什么method_arg_type不再被识别为C的子类?我发现如果A不是模板(如果我只是将类型硬编码到结构中),那么一切正常。

1 个答案:

答案 0 :(得分:4)

您尝试从类型为traits<float>::cls的{​​{1}}派生。它既不是std::conditional<std::is_floating_point<T>::value, A, B>也不是A,它是B模板的特化。要么从它的conditional派生,它会按预期工作,要么使用::type(C ++ 14)。

conditional_t

demo

class C : public traits<float>::cls::type { // ok
                                   ^^^^^^
public:
  virtual void method(method_arg_type arg) {};
};

demo