c++ - 如何从复制构造函数委托(delegate)到通用复制构造函数模板?

标签 c++ c++11 constructor copy-constructor

如果我想写一个通用的复制构造函数(一个可以接受任何参数类型的构造函数),这很容易做到:

class Widget {
public:
  template<typename T> Widget(T&& other);
};

这不会阻止编译器生成传统的复制构造函数,所以我想自己编写并委托(delegate)给模板。但我该怎么做呢?

class Widget {
public:
  template<typename T> Widget(T&& other);
  Widget(const Widget& other): ??? {}         // how delegate to the template?
};

我试过这样写委托(delegate)构造函数,

Widget(const Widget& other): Widget<const Widget&>(other){}

但是 VC11、gcc 4.8 和 clang 3.2 都拒绝它。

如何编写我正在尝试编写的委托(delegate)复制构造函数?

最佳答案

您不能为构造函数模板指定模板参数;你仅限于扣除。也许你可以改编一个 answer来自 my old posts 之一:

// NOT Tested!
#include <utility>

class Widget
{
    enum fwd_t { fwd };

    // Your true master constructor
    template< typename T >  Widget( fwd_t, T &&t );

public:
    template < typename T >
    Widget( T&& other );
        : Widget( fwd, std::forward<T>(other) )
    {}
    Widget( const Widget& other )
        : Widget( fwd, other )
    {}
};

两个单参数构造函数转发给一个双参数兄弟构造函数。

关于c++ - 如何从复制构造函数委托(delegate)到通用复制构造函数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15264252/

相关文章:

c++ - 在 C++11 中从 C++17 重新实现 std::map::try_emplace()?

javascript - 显示对象的对象对象问题

c++ - boost库的编译问题

c++ - 一起使用指针和地址运算符

c++ - 为什么 iostream::eof 在循环条件(即 `while (!stream.eof())` )内被认为是错误的?

c++ - 使用构造函数初始化类中的指针

java - 如何从构造函数中获取实例对象?

c++ - 如何在关键点写坐标?

c++ - c++0x 源文件的默认文件扩展名是什么?

c++ - 获取 std::future<T>::wait_for 的运行时间