c++ - 模板类构造函数采用模板类的实例

标签 c++ templates

我的情况如下:

Class Bar {
...
}

template <class T>
class Foo {
public:
  ...
  Foo(Foo<Bar> bar) {
    ...
  }
  ...
}

因此类 Foo 的构造函数之一可以采用由 Bar 参数化的类 Foo 的元素。这一切都很好,直到我实例化由 Bar 参数化的类 Foo 的某些东西,其中此构造函数被解释为复制构造函数,这不是我想要的。我想知道如何让构造函数在不干扰复制构造函数的情况下采用这样的元素。例如我可以这样做:

template <class T>
class Foo {
public:
  ...
  Foo(Foo<Bar> bar, int unused) {
    ...
  }
  ...
}

而且它工作正常,因为现在构造函数不会与复制构造函数冲突。有没有标准的方法来处理这个问题?

最佳答案

如果你的类模板不需要声明拷贝构造函数(在一般情况下),你可以将构造函数声明为

Foo(Foo<Bar> const& bar);

这将是一般的转换构造函数和 Foo<Bar> 的复制构造函数.其他特化将在适用的情况下使用隐式声明的复制构造函数。

否则,将构造函数设为模板可确保它不是特殊成员。也就是说,必须注意该构造函数不要干扰复制构造函数。这不是很好,但你可以这样做:

template<typename U>
Foo(U bar, typename boost::enable_if<boost::is_same<U, Foo<Bar> > >::type* = 0);

这是一个不是复制构造函数的构造函数,并且只会在传递类型为 Foo<Bar> 的参数时使用。 .请注意,由于重载决策规则,Foo<Bar> 的复制构造函数将优先于此构造函数。


前面是针对 C++03 的。这是一个简单的 C++11 解决方案:

template<int = 0>
Foo(Foo<Bar>);

关于c++ - 模板类构造函数采用模板类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12714384/

相关文章:

c++ - 模板非类型参数推导

c++ - 输入迭代器跳过空格,任何防止这种跳过的方法

c++ - OpenCV 2.4 putText()与Scalar的理解

c++ - 是否有用于 directx 9 c++ 的 irc 聊天室?

c++ - 我怎样才能保留对 move 的东西的引用?

c++ - 代码从 C/C++ 转换为 Delphi

c++ - 编译器如何生成模板类定义?

java - Play2 - 模板 -> 递增

c++ - 模板类不继承基模板类

c++ - 为什么编译器会选择模板参数列表中的基类构造函数?