【问题标题】:Conditional C++ Class Member Definition条件 C++ 类成员定义
【发布时间】:2019-09-13 21:41:47
【问题描述】:

我想根据 C++ 类中的模板参数定义一个类的两个变体。 (我使用的是 C++17。)

例如,如果模板参数bool flag 为真,我希望该类有一个成员:

Class1 foo;

如果flag 为假

Class2 bar;

类定义也会有一些逻辑变化,并使用foobar。我可以使用继承来实现这一点,但我正在探索是否有另一种方法。 https://en.cppreference.com/w/cpp/types/conditional 似乎有帮助,但我不确定。我也可以同时拥有两个成员并在任何给定对象中使用其中一个,但这似乎很浪费,必须有更好的方法。请注意,如果特定解决方案仅允许我交换类而不是名称(可能有条件?),我不一定需要以不同的方式命名成员。

【问题讨论】:

  • 您可以使用模板专业化。
  • 当您描述并寻求解决方案的帮助时,该解决方案实际上应该解决什么问题? 原来的问题是什么?为什么需要根据bool 模板使用不同的成员?也许还有其他解决方案?
  • 为什么不提供Class1Class2 作为模板参数呢?为什么需要为成员变量使用不同的名称?而Class1Class2 是否有相同或相似的接口? Class1Class2 是否有任何关联?

标签: c++ class


【解决方案1】:

如果您可以在两个版本中使用相同的成员名称,那么这很简单:

template <bool flag>
struct Foo {
    std::conditional_t<flag, Class1, Class2> foo;
};

【讨论】:

  • OP 如何调用(或构造)该成员对象并将其传递给 bool?
  • @KhalilKhalaf 该成员不需要布尔值,它可以是任何一种类型。两种类型只需要具有相同的界面,在鸭子类型的意义上。
  • 这个我还是不知道怎么用,没见过。那么如果一个局外人创建了一个boss类的实例,他们在哪里通过flag这个条件呢?老板类怎么知道访问 foo.Class1 stuff 或 foo.Class2 stuff?
  • @KhalilKhalaf 我认为它类似于new Foo&lt;true&gt;()new Foo&lt;false&gt;()
  • @Kulluk007 struct empty {}; ;)
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2021-03-23
  • 1970-01-01
相关资源
最近更新 更多