首页 > 解决方案 > 对任意数量的类使用可变参数模板参数

问题描述

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

我正在尝试以下主要课程

 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;

如何最好地做到这一点?

标签: c++templatesvariadic-templatesparameter-pack

解决方案


如何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<int, double>扩展为:

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;
};

推荐阅读