4

我正在探索 C++ (C++11) 中的模板恶作剧,我想要的一件事是抽象类中的纯虚拟类型。这就像 Scala 的抽象类型。在 C++ 中,我想做如下的事情:

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;
};

知道怎么做吗?

4

2 回答 2

5

我不确定 C++ 是否真的需要这个。

试图让自己处于寻找这种解决方案的设计师的位置,我会说需要这种约束来强制某些类型遵守某些语法约定。

很可能,这是需要的,因为通用算法需要语法约定:它不能与未定义此类类型关联的类型一起使用。

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

template<typename T>
bool foo(T t)
{
    typedef typename T::bar_type FT;
    FT ft;
    ...
}

但如果是这种情况,则无需强制执行atypedef来有效地约束 : 的输入foo<>():简单地省略类型定义 forbar_type不会使该类型与foo<>().

当然,只有在您真正尝试这样做时,您才会发现这一点,而不是之前。并且能够定义一个概念,例如HasBarType,然后强制一些类型来实现这个概念会很好;另一方面,概念还不是 C++ 的一部分,尽管它们是可取的,但没有它们也是可能的。

于 2013-03-04T19:46:51.390 回答
0

编辑

这不起作用,但我认为奇怪的重复模板模式可能是要走的路。

/编辑

template<typename Dependent>
class Base : public Dependent {
    typedef typename Dependent::MyType MyType;
};

然后使用奇怪的重复模板模式

struct Derived : Base<Derived> {
  // Won't compile unless this typedef exists.
  typedef int MyType;
};
于 2013-03-04T19:56:04.783 回答