【问题标题】:C++ - Constructing wrapper class around structure with same syntax as structureC++ - 围绕结构构建包装类,其语法与结构相同
【发布时间】:2020-03-12 05:59:19
【问题描述】:

这是我之前的问题的后续: C++ - Constructing wrapper class with same syntax as wrapped data

基本上,我正在尝试围绕一些数据制作一个包装器模板,并使用与数据相同的语法构造/设置包装器。

如果我使用类似结构的东西,我可以通过转发参数来实现,因此语法可以是:

struct SomeStruct{

    int a, b, c;

    SomeStruct(int _a, int _b, int _c) {/*...*/}

};

// ...

WrapperClass<SomeStruct> wrapped_struct1{1,2,3};
WrapperClass<SomeStruct> wrapped_struct2 = {1,2,3};
WrapperClass<SomeStruct> wrapped_struct3( 1,2,3);

问题在于,这仅在我在结构中定义了该构造函数时才有效。我可以让它工作而不用定义它吗?

包装器目前看起来像这样:

template<typename T> class WrapperClass{
public:
    T data;    
    template <typename...Args>
    WrapperClass(Args&&...args) : data(std::forward<Args>(args)...) {}
};

【问题讨论】:

    标签: c++ templates structure wrapper aggregate-initialization


    【解决方案1】:

    您可以改为list initialization。那么

    如果 T 是 aggregate type,则执行 aggregate initialization

    例如

    template <typename...Args>
    WrapperClass(Args&&...args) : data{std::forward<Args>(args)...} {}
    //                                ^                           ^
    

    【讨论】:

    • 谢谢!我需要/可以保留两个构造函数还是列表初始化一个就足够了?
    • @Newline 你不能,它们不能用相同的签名重载。您必须选择一个,注意在某些情况下效果可能会有所不同;例如对于std::vector(10, 42) 将构造一个vector,其中包含10 个值为42 的元素; {10, 42} 将构造一个vector,其中包含两个元素,其值为1042。您还可以应用 SFINAE 或模板专业化来执行调度。
    • 现在一切都很好,只是复制构造函数和分配不起作用。它给出了一个错误说“无法在初始化中将'WrapperClass'转换为'int'”,并指向list-init函数:S。即使我明确定义了 copy-ctor。
    • 谢谢!我试图了解如何使用可变参数模板做同样的事情。当“Args”为“WrapperClass”时如何阻止该函数被调用,但不知道如何。也许我将不得不问另一个问题:)
    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 2015-07-28
    • 2023-03-30
    • 2011-02-14
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多