2015-05-01 59 views
1

指導申報考慮somethign類似如下:爲模板轉換操作符

template <typename T> struct Foo; 

template <typename S> struct Bar 
{ 
    template <typename T> operator Foo<T>(); 

    // ... 
}; 

class Baz 
{ 
    Baz(Foo<int>&); 
}; 

int main() 
{ 
    Bar<float> bar; 
    Baz  baz(bar); // Won't work 
} 

我想用一個模板操作,以避免代碼/複製和粘貼複製到指定一系列可能的轉換。然而,當然,現在在註釋行代碼中進行一系列轉換將不起作用,因爲在C++中,編譯器不會考慮所有形式的模板化操作符,因爲這將是棘手的。

如果我轉而選擇剪切和粘貼,並定義欄如下:

template <typename S> struct Bar 
{ 
    operator Foo<int>(); 
    operator Foo<float>(); 
    // many more 

    // ... 
}; 

現在鏈接轉換可以判​​斷和發現。我想要的是能夠擁有我的蛋糕並將它吃掉,特別是將操作符定義爲模板,還提供了一系列指導聲明,可以將轉換操作符定義爲非模板:

template <typename S> struct Bar 
{ 
    template <typename T> operator Foo<T>(); 

    template operator Foo<int>(); // Not valid C++ 
    template operator Foo<float>(); // Not valid C++ 
    // ... 
}; 

有沒有辦法在C++ 11/C++ 14中完成這項工作?有沒有人對構建代碼的建議有所幫助,以避免複製轉換運算符的定義,但是仍然有一組有限的轉換運算符實例可以像使用單獨定義一樣使用?

回答

1

你的問題是不是在你的轉換操作符聲明,這是你的Baz構造:

Baz(Foo<int>&); 

這需要一個非const引用Foo<int>。當您將Bar<S>隱式轉換爲Foo<T>時,您將生成一個臨時對象,該對象不能綁定到非常量引用。如果將其更改爲通過引用常量來引用參數,則它爲works

Baz(const Foo<int>&); 

,如果你願意,你可以愉快地聲明爲特定類型的特定運營商:

template <typename S> struct Bar 
{ 
    template <typename T> operator Foo<T>(); 
    operator Foo<bool>(); 
}; 

Bar<float> a{}; 
Foo<int> b = a; //calls operator Foo<T> 
Foo<bool> c = a; //calls operator Foo<bool>