給定一個帶模板參數的類typename T
和class Tuple
我想提供一個特殊的構造函數,如果Tuple
具有std::vector
類似成員函數reserve
和push_back
。如果Tuple
有沒有這樣的成員函數,那麼我想提供一個特殊的構造,如果Tuple
是從類型轉換爲T
可變參數構造的,即我怎樣纔能有條件地切換兩個具有相同簽名的構造函數?
template<typename T, class Tuple>
class vector
{
template<typename... Elements,
typename = decltype(std::declval<Tuple>().push_back(T())),
typename = decltype(std::declval<Tuple>().reserve(size_type()))>
vector(Elements&&... elements)
{ /* ... */ }
template<typename... Elements, typename = typename = decltype(Tuple{ static_cast<T>(std::declval<Elements>())... })>
vector(Elements&&... elements)
{ /* ... */ }
};
問題1:顯然,在代碼上面的編譯器不知道我想盡可能採用第一個構造函數。無論如何,我怎樣才能達到理想的行爲?
問題2:假設第一個構造函數不存在,爲什麼下面的代碼會導致編譯器錯誤「不能從初始化列表轉換爲
vector<double, Tuple<double>>
」:
template<typename T>
class Tuple
{
public:
Tuple() { }
Tuple(std::initializer_list<T>) { }
};
int main()
{
vector<double, Tuple<double>> x = { 1, 2, 3 };
return 0;
}
當兩個條件('A'和'B')都不滿足時發生了什麼。然後,'ctor_tag'將是'no_tag'。我是否需要爲該標籤提供第三個構造函數? – 0xbadf00d
@ 0xbadf00d它取決於不滿意是否是邏輯錯誤。如果不符合前提條件之一(實現類型的參數),則不執行no_tag情況會爲您提供編譯器錯誤。這可能非常有用。 –
@RichardHodges如果'Tuple'適合,我們的想法是有條件地啓用這些構造函數。如果'Tuple'不適合,那麼這些構造函數應該被禁用。不應該生成編譯器錯誤,因爲我不想強制'Tuple'滿足兩個條件之一。 – 0xbadf00d