【问题标题】:Using variadic template arguments for arbitrary number of classes对任意数量的类使用可变参数模板参数
【发布时间】:2021-06-03 12:11:21
【问题描述】:

我有一种情况,我需要一个类 FaceProp 来维护/持有其他类的实际面部类型。这些可以是任何类型的面,例如边界面、实体面、内部面等。我想使用 C++ 中的可变参数包功能实现FaceProp,但我不确定如何实现。

我正在尝试以下主要课程

 template<typename... FaceTypes>
 class FaceProp 

 {
     FaceProp(){
         /// here construct all those template argument classes. 
      }

  private:

   // declare here the classes to the FaceTypes.
   // e.g. If this class was declared with two face types I would have :
   //   std::unique_ptr<FaceType1> type1;
   //   std::unique_ptr<FaceType2> type2;

 }

我不确定如何声明它们,因为在实施时我不知道我需要处理多少/以及哪些面部类型。这是通过编译时间知道的。换句话说,当我想声明 FaceProp 类时,我会知道要使用多少种面部类型

例如

 std::unique_ptr<FaceProp<facetype1, facetype2>> allfaces;

如何做到最好?

【问题讨论】:

  • 我觉得这个案例最好用interface解决。
  • 但是FaceTypes 与FaceProp 有什么关系? FaceProp 继承自所有 FaceTypes? FaceProp 必须包含 std::tuple&lt;FaceTypes...&gt;?还是std::variant&lt;FaceTypes...&gt;?
  • std::tuple 是要走的路。否则,您基本上需要重新实现元组,这并非易事。
  • @HolyBlackCat 你能详细说明一下吗?另外,你对可变参数模板参数有什么好的参考,感觉我不理解这个概念,我应该

标签: c++ templates variadic-templates parameter-pack


【解决方案1】:

按照 cmets 中的建议,如何使用 std::tuple 执行此操作的示例。我展示了有无std::unique_ptr。

template <typename... FaceTypes>
class FaceProp
{
   FaceProp() {
      m_tuple = {FaceTypes()...};
      m_uniqueTuples = {std::make_unique<FaceTypes>()...};
   }

private:
   std::tuple<FaceTypes...> m_tuple;
   std::tuple<std::unique_ptr<FaceTypes>...> m_uniqueTuples;
};

代码中的... 扩展了相关的表达式以包含参数包中的每种类型。所以,FaceProp&lt;int, double&gt; 扩展为:

class FaceProp
{
   FaceProp() {
      m_tuple = {int(), double()};
      m_uniqueTuples = {std::make_unique<int>(), std::make_unique<double>()};
   }

private:
   std::tuple<int, double> m_tuple;
   std::tuple<std::unique_ptr<int>, std::unique_ptr<double>> m_uniqueTuples;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多