Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将构造函数转发到成员对象_C++_Templates_C++11_Constructor - Fatal编程技术网

C++ 将构造函数转发到成员对象

C++ 将构造函数转发到成员对象,c++,templates,c++11,constructor,C++,Templates,C++11,Constructor,这是将所有构造函数转发到成员数据结构的好方法吗 template<typename VectorData> class VectorFunctionality { VectorData data; public: VectorFunctionality() = default; VectorFunctionality(const VectorFunctionality&) = default; template<typename ...A

这是将所有构造函数转发到成员数据结构的好方法吗

template<typename VectorData>
class VectorFunctionality
{
    VectorData data;
public:
    VectorFunctionality() = default;
    VectorFunctionality(const VectorFunctionality&) = default;
    template<typename ...Args>
    VectorFunctionality(Args... args) : data(std::forward<Args>(args)...) {};
};
模板
类向量功能
{
矢量数据;
公众:
向量功能()=默认值;
矢量功能(常量矢量功能&)=默认值;
模板
矢量功能(Args…Args):数据(std::forward(Args)…{};
};
VectorData可以是std::array、std::vector等。 VectorFunction继承了所有VectorData c'tor。
这有助于避免在VectorFunction中写入许多c'tor,其他用于std::array,其他用于std::vector。

您必须小心一点,因为可变构造函数可能会无意中匹配您不希望它匹配的内容

以以下(未经测试的)代码为例:

VectorFunctionality<int> vf1;
VectorFunctionality<int> vf2(vf1); // Unintentionally calls the templated constructor
矢量功能vf1;
矢量功能vf2(vf1);//无意中调用模板化构造函数
给定对矢量函数的非常量引用,可变构造函数更适合,因为它不需要非常量到常量的转换,因此调用它而不是复制构造函数

解决此特定问题的一种方法是添加另一个构造函数,如中所示:

VectorFunctionality(VectorFunctionality& that) : VectorFunctionality(static_cast<VectorFunctionality const&>(that)) {}
vectorFunctional(vectorFunctional&that):vectorFunctional(static_cast(that)){

注意:这个问题还有其他表现形式(例如,如果您有一个从VectorFunction派生的实例怎么办?。

如果编译器支持C++11构造函数继承,可能只使用
private
heritation,在构造函数中继承。免责声明:我还没有尝试过。如果您这样粗心地编写,那么
std::is_constructible::value
对于
Args…
的任何选择都是正确的,这可能是不受欢迎的。还可以使用
矢量功能(Args&…Args)
隐式转发参数。在一般情况下,我不认为这提供了一个好的和简单的API。用户不会很容易理解构造函数的用法,除非你有一个很好的文档,它的副本构造永远不会与构造函数模板匹配:上面的代码会调用[defaulted]副本构造函数。即使它将调用模板构造函数,它实际上也会做正确的事情,即将调用转发给成员。直接引用绑定w/o派生到基转换是完全匹配的,cv限定并不重要。它只适用于比较两个引用绑定,而OP的ctor模板则不适用。在这里,我们有两个精确匹配,但一个模板和一个非模板,因此选择了非模板。@DietmarKühl“复制构造从未与构造函数模板匹配”我对此不确定。ctor模板从未被视为复制或移动ctor,但它可以通过重载解析来选择,作为比采用
const&
AFAIK的惯用复制ctor更好的匹配。这要求两者都采用引用。您可以使用
const\u cast
而不是
static\u cast
@DyP:interest。我一直认为你不能用模板构造函数劫持复制构造。似乎,模板构造函数不会禁止编译器创建自己的版本,但这并不意味着复制构造函数总是用于复制!非常感谢您指出这一点!