构造函数中的c ++参数包规范而不是模板
c++ parameter pack specification in constructor rather than template
与带有参数包的函数声明不同,我发现 类 需要尖括号中每个参数的类型...
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;
};
- 有没有办法从上面的语句中删除
int, int
?
- 如果是,可以删除吗?
- 另外,我的实例化方式
m_data
安全吗?使用时
std::forward<T_Args>(args)...
我的编译器告诉我我没有
可以转换所有参数类型的构造函数。
模板参数推导仅适用于函数调用,因此实现所需内容的基本模式如下所示:
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)
一种方法是使构造函数成为模板:
#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
.
来缓解
与带有参数包的函数声明不同,我发现 类 需要尖括号中每个参数的类型...
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;
};
- 有没有办法从上面的语句中删除
int, int
? - 如果是,可以删除吗?
- 另外,我的实例化方式
m_data
安全吗?使用时std::forward<T_Args>(args)...
我的编译器告诉我我没有 可以转换所有参数类型的构造函数。
模板参数推导仅适用于函数调用,因此实现所需内容的基本模式如下所示:
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)
一种方法是使构造函数成为模板:
#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
.