模板类构造函数采用模板类的实例
Template class constructor takes instance of template class
我的情况如下:
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>);
这实际上不是有效的复制构造函数,因为复制构造函数应遵循以下四种格式之一:
MyClass( const MyClass& other );
MyClass( MyClass& other );
MyClass( volatile const MyClass& other );
MyClass( volatile MyClass& other );
为了使一切按预期工作,请将参数作为指针传递:
Foo(Foo<Bar>* bar) {
// Logic
}
如果按值传递它,如果您的逻辑模仿复制构造函数,则可以很好地创建一个无限循环。
相关文章:
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- C++初始化类实例时隐式调用类成员的构造函数
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++ 常量正确性/缺少支持常量和非常量实例的类的常量构造函数
- C++ - 使用另一个类的构造函数实例化一个对象
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- C++如何在类构造函数中实例化 std::array?
- 避免通过操作从私有构造函数间接实例化
- 类构造函数 - 没有构造函数的实例
- 没有构造函数模型的实例::模型匹配参数列表
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- C++:如何在结构中定义类实例.类具有参数化的构造函数
- 在保证复制的世界中构造函数实例化
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- C++构造函数的实例都与参数列表匹配
- 为什么GCC将对全局实例构造函数的调用放在不同的部分(取决于目标)
- 如果使单一实例构造函数受到保护,缺点是什么 - 继承 - C++11.