【问题标题】:passing arument list to a constructor through a wrapper in c++通过 C++ 中的包装器将参数列表传递给构造函数
【发布时间】:2015-04-10 11:34:10
【问题描述】:

我想编写一个包装函数,我可以将一些类对象的构造函数初始化参数传递给它。然后这个包装器将使用这个列表并在定义该类的新对象时传递给构造函数。不确定为此目的使用什么 STL 或任何其他数据类型。基本上在下面的代码中应该为 argument_list 使用什么数据类型。有什么图书馆可以提供帮助?

一些透视代码

class abc{
    int a_;
    char b_;
    public:
    abc(int a, char b)
        :a_(a), b_(b)
    {
    }
}
// Wrapper
template <typename T>
void create_object_wrapper(argument_list list) // assuming argument_list can                              
                                       //hold the parameters as
                                       //intended
{
     abc v1(list); //The use case I want
}      

int main()
{
 create_object_wrapper(1,'a'); // initialize object with (1, 'a')
 return 0;
}

提前致谢。

【问题讨论】:

标签: c++ templates boost constructor stl


【解决方案1】:

使用可变参数完美转发:

template <typename... Args>
void create_object_wrapper(Args&&... list)
{
     abc v1(std::forward<Args>(list)...);
}  

【讨论】:

    【解决方案2】:

    使用模板参数包:

    template <typename... Args>
    void create_object_wrapper(Args... list)
    {
         abc v1(list...);
    }  
    

    如果使用导致无效的abc 构造函数调用的参数调用,这将无法编译。

    【讨论】:

    • 如果参数列表中的类型之一是只移动类型,它也会失败。
    【解决方案3】:

    如果您想根据提供的参数立即创建对象,请按照 sehe 的回答。

    如果您想存储提供的参数以便以后创建一个或多个对象,那么您应该使用std::tupel。按照this question 中给出的答案来了解如何做到这一点。理想情况下,您希望为此使用 C++14(请参阅我对该问题的回答)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2015-02-22
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 2018-08-05
      相关资源
      最近更新 更多