如何从可变参数模板参数的嵌套类中派生?

好奇乔治

给定以下两个结构,一个可以从两个嵌套的“嵌套”类派生,然后从派生对象调用foo()和bar():

struct WithNested1 {
    template<class T> struct Nested {
        void foo();
    };
};

struct WithNested2 {
    template<class T> struct Nested {
        void bar();
    };
};

struct Test : WithNested1::Nested<Test>,
              WithNested2::Nested<Test>
{

};

Test test;
test.foo();
test.bar();


但是,如果两个外部类都作为可变参数模板参数传递,那么您将如何从它们中派生呢?

例如,这无法编译:

template<typename... Ts>
struct Test : Ts::template Nested<Test>...
{

};

Test<WithNested1, WithNested2> test;
test.foo();
test.bar();

错误:“ foo”:不是“测试”的成员
错误:“ bar”:不是“测试”的成员

奇怪的是,如果删除了对foo()和bar()的调用,它将进行编译。

亚伦曼
template <typename... Ts>                                                          
struct Test : Ts::template Nested<Test<Ts...>>...                                  
{                                                                                  

};  

这是与上面相同的答案,但我想我会解释它是如何工作的。在您的示例中,首先Test没有模板参数(编译器应警告您),但我们应该给模板参数。CRTP的目的是为您提供从您与类型相同的模板参数继承的类,这样它就可以通过模板参数访问您的方法和成员。在这种情况下,您的类型Test<Ts...>就是您必须通过的类型。正如@aschepler指出的那样,您通常可以单独使用Test,但是直到您已经在类中时,它才在范围内。

我认为这是一种更清洁的方式来做您想要的事情。

template <typename T>                                                              
struct A {                                                                         
    void bar (){                                                                   
        static_cast<T*>(this)->val = 3;                                            
    }                                                                              
};                                                                                 

template <typename T>                                                              
struct B {                                                                         
    void foo (){                                                                   
        static_cast<T*>(this)->val = 90;                                           
    }                                                                              
};                                                                                 


template <template<class> class ... Ts>                                            
struct Test : Ts<Test<Ts...>>...                                                   
{                                                                                  
    int val;                                                                       
};                                                                                 

int main() {                                                                       
    Test<A,B> test;                                                                
    test.foo();                                                                    
    test.bar();                                                                    
    return 0;                                                                      
}  

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

嵌套类中的可变参数模板

来自分类Dev

可变参数模板类中的派生(虚拟)函数参数

来自分类Dev

如何仅对父类可变参数模板参数启用嵌套类模板?

来自分类Dev

如何仅对父类可变参数模板参数启用嵌套类模板?

来自分类Dev

如何扩展可变参数模板类

来自分类Dev

如何使可变参数模板类方法以函数指针作为从函数模板派生的类型作为参数?

来自分类Dev

可变参数模板类的可变参数模板

来自分类Dev

可变参数模板类的可变参数模板

来自分类常见问题

如何存储可变参数模板参数?

来自分类Dev

如何扩展对可变参数模板基类的调用?

来自分类Dev

菊花链可变参数模板类

来自分类Dev

从派生的可变参数模板类中调用基本模板的虚拟方法

来自分类Dev

可变参数模板对

来自分类Dev

可变参数模板类-可变参数成员函数

来自分类Dev

为什么这个嵌套的可变参数模板是无效的参数?

来自分类Dev

带有嵌套映射的可变参数模板参数推断

来自分类Dev

如何通过使用可变参数模板参数来专门化元组的类模板?

来自分类Dev

递归可变参数模板如何工作?

来自分类Dev

如何传递可变参数模板函数?

来自分类Dev

如何重载可变参数模板函数?

来自分类Dev

创建从可变参数模板包派生的类型的元组

来自分类Dev

可变参数模板类参数容器实例化

来自分类Dev

可变参数模板类参数容器实例化

来自分类Dev

如何按类型派生过滤可变参数模板包?

来自分类Dev

С++可变参数模板:实现可变参数

来自分类Dev

可变参数模板与类模板的专业化

来自分类Dev

模板类中的可变参数模板构造器规范

来自分类Dev

可变参数模板与类模板的专业化

来自分类Dev

让需要单个模板参数的模板模板参数的类接受可变参数模板参数的模板模板参数?

Related 相关文章

  1. 1

    嵌套类中的可变参数模板

  2. 2

    可变参数模板类中的派生(虚拟)函数参数

  3. 3

    如何仅对父类可变参数模板参数启用嵌套类模板?

  4. 4

    如何仅对父类可变参数模板参数启用嵌套类模板?

  5. 5

    如何扩展可变参数模板类

  6. 6

    如何使可变参数模板类方法以函数指针作为从函数模板派生的类型作为参数?

  7. 7

    可变参数模板类的可变参数模板

  8. 8

    可变参数模板类的可变参数模板

  9. 9

    如何存储可变参数模板参数?

  10. 10

    如何扩展对可变参数模板基类的调用?

  11. 11

    菊花链可变参数模板类

  12. 12

    从派生的可变参数模板类中调用基本模板的虚拟方法

  13. 13

    可变参数模板对

  14. 14

    可变参数模板类-可变参数成员函数

  15. 15

    为什么这个嵌套的可变参数模板是无效的参数?

  16. 16

    带有嵌套映射的可变参数模板参数推断

  17. 17

    如何通过使用可变参数模板参数来专门化元组的类模板?

  18. 18

    递归可变参数模板如何工作?

  19. 19

    如何传递可变参数模板函数?

  20. 20

    如何重载可变参数模板函数?

  21. 21

    创建从可变参数模板包派生的类型的元组

  22. 22

    可变参数模板类参数容器实例化

  23. 23

    可变参数模板类参数容器实例化

  24. 24

    如何按类型派生过滤可变参数模板包?

  25. 25

    С++可变参数模板:实现可变参数

  26. 26

    可变参数模板与类模板的专业化

  27. 27

    模板类中的可变参数模板构造器规范

  28. 28

    可变参数模板与类模板的专业化

  29. 29

    让需要单个模板参数的模板模板参数的类接受可变参数模板参数的模板模板参数?

热门标签

归档