我有一个 CRTP 层次结构,其中子级定义了父级要使用的类型,但该类型具有对父级的回调:
template<template<class> class CALLBACK>
class Option1
{
};
template<class SUB>
class Parent
{
using ThisClass = Parent<SUB>;
typename SUB::template Sender<ThisClass> _osm;
};
class Child : public Parent<Child>
{
using Sender = Option1;
};
int main()
{
Child rm;
}
我以为我可以使用模板模板参数来解决这个问题,但我仍然遇到编译器错误:
<source>:15:28: error: no member named 'Sender' in 'Child'
有可能实现这个目标吗?
你不能直接这样做,因为
SUB
中的Parent
是一个不完整的类型,但你可以使用类型特征技术并将Sender
类型放入单独的辅助结构中:
template<template<class> class Callback>
class Option1 {
};
class Child;
template<class>
struct GetSender;
template<>
struct GetSender<Child> {
template<template<class> class Callback>
using Type = Option1<Callback>;
};
template<class Sub>
class Parent {
typename GetSender<Sub>::template Type<Parent> _osm;
};
class Child : public Parent<Child> {
};
这是有效的,因为
GetSender
不需要完整的 Sub
。