2013-03-04 91 views
4

我正在探索C++(C++ 11)中的模板shenanigans,我想要的一件事是抽象类中的纯虚拟类型。这就像斯卡拉的abstract types。在C + +我想要做的事情如下: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; 
}; 

任何想法如何做到这一点?

+2

为什么需要这个? – Xeo 2013-03-04 19:46:14

+1

你想要什么?知道你的目标肯定会让你更好地回答问题。不,“模拟一些随机的Scala功能”不算作目标。 – 2013-03-04 19:46:16

+0

@Xeo - 海报是“探索模板shenanigans” - 这是一个人为设定的目标,但仍然是一个目标! :) – wilsonmichaelpatrick 2013-03-04 20:08:30

回答

5

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

试图让自己置身于寻找这样一种解决方案的设计师的位置,我会说这种约束将需要执行某些类型以遵守一些语法约定。

最有可能的是,这是需要的,因为通用算法需要语法约定:它不能用于不定义这种类型关联的类型。

例如,下面的算法需要它的参数的类型有关联的bar_type

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

但是,如果是这样的话,就没有必要对执行一个typedef有效地约束了输入foo<>():简单地省略bar_type的类型定义将不能使用该类型与foo<>()

当然,只要你真的尝试这样做,而不是之前,你会发现这一点。并能够定义概念HasBarType,然后强制执行某些类型以实现该概念将会很好;另一方面,概念并不是,而是 C++的一部分,尽管它们是可取的,但没有它们也是可能的。

+0

如果您希望能够使现有的第三方或原始类型满足您的要求,还有'my_tag_type :: bar_type'。参见'std :: iterator_traits :: value_type'。 – 2013-03-04 20:00:35

+0

@MooingDuck:对,这是执行它的另一种方式 – 2013-03-04 20:02:48

+0

@AndyProwl,你已经掌握了头脑的概念;我试图强制早期编译失败,如果一个类型类(基本上是一个Concept,据我了解)没有正确实现。 – emchristiansen 2013-03-04 20:18:10

0

编辑

这是不行的,但我认为curiously recurring template pattern可能是要走的路。

/编辑

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

然后使用curiously recurring template pattern

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

[你试过编译](http://liveworkspace.org/code/2x2bEe$8)?顺便说一句,缺少'typename' :-) – 2013-03-04 19:58:09

+0

@PeterWood,我试图通过CRTP解决这个问题,但没有成功。这个明显的问题:CRTP增加了从Base到Derived的依赖关系,当Derived对Base有依赖关系时,你可以获得无限的模板循环。 – emchristiansen 2013-03-04 20:22:37