我想知道是否可以在類型上使用某些約束來進行轉發,以便可以自動執行重載。例如,假設我有以下基本函數:使用std :: forward重載函數轉發
int f(A a, B b)
{
return g(a) + h(b);
}
其中A
和B
是包含所有適當的複製和移動構造函數的類,和g
和h
是函數的每一個具有兩個重載:int g(const A&)
,int g(A&&)
,和h
一樣。通常的方式轉發a
和b
在f
將
template <typename T1, typename T2>
int f(T1&& a, T2&& b)
{
return g(std::forward<T1>(a)) + h(std::forward<T2>(b));
}
不過,我想也添加另一種方式來使用此功能:如果我嘗試使用轉發與此重載
int f(B b, A a)
{
return g(a) + h(b);
}
,生成的模板函數會這樣:
template <typename T1, typename T2>
int f(T1&& b, T2&& a)
{
return g(std::forward<T1>(a)) + h(std::forward<T2>(b));
}
它將與第一個模板發生衝突。
所以我的問題是,當我寫一個模板函數轉發,我能約束T1
和T2
,這樣在第一超載,T1
只能綁定到const A&
和A&&
,而第二個重載可以觸發如果T1
是const B&
或B&&
?
沒有這樣的機制,我需要明確地寫8個重載。
注:我想我也許能在這個玩具爲例做了一些模板的東西(有點討厭)從type_traits
,但我想第一個知道,如果有一個更簡單的方法,因爲在現實中,過載可比這個玩具的例子更多不同。
這是否阻止我做出另一個超載? – Tunococ
我認爲這是隱含的。然後我會添加它。 – Tunococ
@Tunococ沒有什麼能夠阻止你再次造成超負荷 - 你只需要確保它不會含糊不清。 – Barry