我有这个我正在尝试解决的难题,从根本上归结为以下示例:
template <typename CT>
struct A
{
typedef typename CT::VALUE_T FOO; // FOO is dependent on CT
};
template <typename CT>
struct B
{
typedef typename CT::BAR BAR;
BAR foo() {}
};
template <typename DT>
struct C : B<C<DT> >
{
typedef DT VALUE_T;
typedef typename A<C>::FOO BAR;
};
int main () {
C<int> c;
}
我可以尝试解释上面的(我尝试了大约三遍并删除了文本!),但基本上要求是:
C
必须继承自B
typed withC
(利用 CRTP),即B<C<>>
C
是唯一可以实例化的A
(即A
必须用 键入C
)A
是唯一可以定义的FOO
(FOO
取决于类型CT
,关系比呈现的更复杂)
问题(如您在上面的代码中看到的)是该BAR
类型仅在内部可用,C
并且在实例化时不完整B
,因此B
看不到BAR
模板参数的类型CT
(C<int>
)。不幸的是B
,该类型BAR
被用作函数的参数和返回类型(即不仅限于函数范围 - 因此我不能简单地将 typedef 移动到函数范围)。
有没有解决的办法?我不能打破上述关系(除非作为最后的手段)。大概使用 c++11,我可以使用auto
并解决在 中使用BAR
typedef的需要B
,但是目前这还不是一个选项。
编辑:继@bitmasks 的评论之后,提供更多信息。
A
和中的代码B
在不同情况下用于相当多的二进制文件中,在这种情况下唯一独特的情况是C
派生自B
,在其他情况下,C
拥有派生自的事物的实例B
。- 模板参数可以更改(在
A
and中B
),只要它们可以默认为不需要更改 and 的现有用途的A
值B
。同一组类型必须可用作默认的模板参数或某些其他机制。
我在这里使用模板只是因为我需要紧耦合并且我需要在不同情况下灵活地使用代码。
组件说明:
A
最好将其描述为容器,FOO
实际上是一个迭代器,它包含的内容由模板参数的 typedef 定义B
最好将其描述为包含一组函数的基类,这些函数由C
. 在前面的案例中,这些组件被传递了一个对派生自的事物的引用B
(并且这些事物也归 拥有C
),在这种情况下,我提供了对其C
自身的引用。
主要的复杂性来自于访问容器,以前和A
之间的关系是有一个实例的,但现在是一个实例- 这种语义上的变化打破了将类型注入类的方式。B
C
C
B
C
B