【问题标题】:How to pass generic arguments to the nested generic classes in C++如何将泛型参数传递给 C++ 中的嵌套泛型类
【发布时间】:2022-11-23 20:56:16
【问题描述】:

我在 C++ 中有一个类和一个嵌套类,它们都是通用类。

#define GENERIC template<typename T>

GENERIC
class Class1 final{
private:
    GENERIC
    class Class2 final{
    private:
        T class2Field{};
    };

    T class1Field{};
};

我想将实例化时传递给Class1的类型参数T传递给Class 2。我怎样才能做到这一点?

【问题讨论】:

  • 第一步是停止使用宏.
  • 通过不使用创建您自己的特殊宏有限的C++ 子集。拼出模板介绍器,并为每个参数指定自己的名称。然后你就可以随意使用这些名字了。这个问题类似于关于男人去看医生并抱怨“当我做这种奇怪的事情时很痛”的笑话,所以医生当然会回答“那好吧,不要做这种奇怪的事情”。
  • 这里不需要使用宏。

标签: c++ generics


【解决方案1】:

Class2可以看到Class1的声明,因此在没有声明模板类时将使用Class1T

template<typename T>
class Class1 final {
private:
    class Class2 final {
    private:
        T class2Field{};
    };

    T class1Field{};
};

所以Class1&lt;int&gt;::Class2::class2Field 将是int 类型。


最好不要使用宏:Why are preprocessor macros evil and what are the alternatives?

【讨论】:

  • 问题说这两个类都是泛型。在您的回答中,嵌套类不是模板化的。
  • 正确的,我编辑了它。
  • 不要让你的答案与mine 相同,你可以只添加一个链接到我的答案,说如果Class2 也是一个模板,然后参考那个答案。
  • 我在你发布之前编辑过,我可以回滚,当然。
【解决方案2】:

如何将泛型参数传递给 C++ 中的嵌套泛型类

由于嵌套类也是模板化的,您可以使用默认参数,如下所示:

template<typename T>
class Class1 {
private:
//-----------vvvvvvvvvvvvvv---->use default argument
    template<typename U = T>
    class Class2 {
    private:
        U class2Field{};
    };

    T class1Field{};
};

现在Class1&lt;int&gt;::Class2::class2Field 将是int 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多