如何从 C++ 中的包构造 class?
How to construct a class from a pack in C++?
我正在尝试用一个包作为参数传递给我的函数来初始化一个 class。这是我到目前为止得到的:
struct Vec3
{
float x, y, z;
};
template<typename _Ty, typename... Args>
__forceinline _Ty construct_class(Args&&... arguments)
{
return _Ty(arguments...);
}
// here I am trying to construct a Vec3 by calling construct_class
Vec3 vec = construct_class<Vec3>(10.f, 20.f, 30.f);
不幸的是,我在 visual studio 中遇到以下编译器错误:C2440 '<function-style-cast>': cannot convert from 'initializer list' to '_Ty'
我见过有人这样做:
template<typename _Ty, typename... Args>
__forceinline _Ty construct_class(Args&&... arguments)
{
return _Ty(std::forward<Args>(arguments)...);
}
但这对我也不起作用,我得到了与以前完全相同的编译器错误。
所以我的问题是我应该如何使用 construct_class 中的 pack/intializer 列表来构造 _Ty
class(在本例中为 Vec3
)?我不熟悉 C++ 中的包。
您可以将 return _Ty(arguments...)
替换为 return _Ty{arguments...}
,如下所示:
//---------------v--------------------- v----->removed the underscore
template<typename Ty, typename... Args> Ty construct_class(Args&&... arguments)
{
//-----------v------------v------------------->used curly braces instead of parenthesis
return Ty{arguments...};
}
另外,请注意,给定的程序将 work 使用 C++20 而无需使用大括号。
此外,What are the rules about using an underscore in a C++ identifier? 在名称中使用前导下划线时可能会派上用场。
我正在尝试用一个包作为参数传递给我的函数来初始化一个 class。这是我到目前为止得到的:
struct Vec3
{
float x, y, z;
};
template<typename _Ty, typename... Args>
__forceinline _Ty construct_class(Args&&... arguments)
{
return _Ty(arguments...);
}
// here I am trying to construct a Vec3 by calling construct_class
Vec3 vec = construct_class<Vec3>(10.f, 20.f, 30.f);
不幸的是,我在 visual studio 中遇到以下编译器错误:C2440 '<function-style-cast>': cannot convert from 'initializer list' to '_Ty'
我见过有人这样做:
template<typename _Ty, typename... Args>
__forceinline _Ty construct_class(Args&&... arguments)
{
return _Ty(std::forward<Args>(arguments)...);
}
但这对我也不起作用,我得到了与以前完全相同的编译器错误。
所以我的问题是我应该如何使用 construct_class 中的 pack/intializer 列表来构造 _Ty
class(在本例中为 Vec3
)?我不熟悉 C++ 中的包。
您可以将 return _Ty(arguments...)
替换为 return _Ty{arguments...}
,如下所示:
//---------------v--------------------- v----->removed the underscore
template<typename Ty, typename... Args> Ty construct_class(Args&&... arguments)
{
//-----------v------------v------------------->used curly braces instead of parenthesis
return Ty{arguments...};
}
另外,请注意,给定的程序将 work 使用 C++20 而无需使用大括号。
此外,What are the rules about using an underscore in a C++ identifier? 在名称中使用前导下划线时可能会派上用场。