[英]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
}
如果按值傳遞它,如果您的邏輯模仿復制構造函數,則可以很好地創建無限循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.