CRTP 子级定义父级使用的类型

问题描述 投票:0回答:1

我有一个 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'

有可能实现这个目标吗?

c++ templates crtp
1个回答
0
投票

你不能直接这样做,因为

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

© www.soinside.com 2019 - 2024. All rights reserved.