如何从 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...};
}

Working Demo


另外,请注意,给定的程序将 work 使用 C++20 而无需使用大括号。


此外,What are the rules about using an underscore in a C++ identifier? 在名称中使用前导下划线时可能会派上用场。