构造函数而不是模板中的c++参数包规范

c++ parameter pack specification in constructor rather than template

本文关键字:c++ 参数 包规范 构造函数      更新时间:2023-10-16

与带有参数包的函数声明不同,我发现类需要尖括号中每个参数的类型。。。

Component<IntegerPair, int, int> temp(40, 5);

这似乎是多余的。以下是我如何定义Component:

template<typename T, class... T_Args>
class Component
{
public:
  Component(T_Args... args)
    : m_data(args...)
  {}
  T m_data;
};
  1. 有没有办法从上述语句中删除int, int
  2. 如果是,是否可以删除它
  3. 另外,我实例化m_data的方式安全吗?使用时std::forward<T_Args>(args)...我的编译器告诉我我没有构造函数,该构造函数可以转换所有参数类型

一种方法是使构造函数成为模板:

#include <utility>
struct IntegerPair {
    IntegerPair(int, int) {}
};
template<typename T>
class Component
{
public:
  template<typename... T_Args>
  Component(T_Args&&... args)
    : m_data(std::forward<T_Args>(args)...)
  {}
  T m_data;
};
int main()
{
    Component<IntegerPair> c {1,2};
}

这在功能上等价于std::vector及其成员函数emplace_back。这很好,IMO。错误消息非常神秘,就像在这样的模板结构中一样,但这可以通过适当的static_assert来缓解。

模板参数推导仅适用于函数调用,因此实现所需功能的基本模式如下:

template<typename T, class... T_Args>
Component<T, T_Args...> makeComponent(T_Args&&... args) {
   return Component<T, T_Args...>(std::forward<T_Args>(args)...);
}

用法:

auto c = makeComponent<IntegerPair>(1, 1)