关于scala:C ++:纯虚拟类型

C++: Pure virtual type

我正在探索C++中的模板ShanaIGANS(C++ 11),我想拥有一个抽象类中的纯虚拟类型。这类似于scala的抽象类型。在C++中,我想做如下的事情:

1
2
3
4
5
6
7
8
9
10
struct Base {
  // Says any concrete subclass must define Type, but doesn't
  // require that it be anything in particular.
  virtual typedef MyType;
};

struct Derived : Base {
  // Won't compile unless this typedef exists.
  typedef int MyType;
};

知道怎么做吗?


我不确定C++中是否真的需要这样做。

试图把自己放在一个寻求这样一个解决方案的设计师的位置上,我会说需要这种约束来强制某些类型遵守某些语法约定。

最有可能的是,这是需要的,因为通用算法需要句法约定:它不能与没有定义此类类型关联的类型一起工作。

例如,下面的算法要求其参数类型具有关联的bar_type

1
2
3
4
5
6
7
template<typename T>
bool foo(T t)
{
    typedef typename T::bar_type FT;
    FT ft;
    ...
}

但是如果是这样的话,就不需要强制执行typedef来有效地约束foo<>()的输入:简单地省略bar_type的类型定义就不能使该类型与foo<>()一起使用。

当然,只有当你真的这么做时,你才会发现这一点,而不是以前。并且能够定义一个概念,比如EDCOX1,5,然后执行一些类型来实现这个概念是好的;另一方面,概念还不是C++的一部分,并且,正如他们所希望的那样,没有它们是可能的。


编辑

这不起作用,但我认为奇怪的重复模板模式可能是可行的方法。

编辑

1
2
3
4
template<typename Dependent>
class Base : public Dependent {
    typedef typename Dependent::MyType MyType;
};

然后使用奇怪的循环模板模式:

1
2
3
4
struct Derived : Base<Derived> {
  // Won't compile unless this typedef exists.
  typedef int MyType;
};