我想知道是否有可能讓ADL選擇在其中一個參數(或在其他一些明確定義的地方)的類的命名空間中定義的函數模板當其他功能模板可見時的情況。我有一個激勵的例子,儘管我知道這個特定案例的解決方法(我在下面討論),但總的來說這個問題似乎是有道理的。如何讓ADL更喜歡功能模板到另一個
我覺得挺酷的,以避免使用朋友的聲明,而是工作委託給方法,從而想出了
namespace n
{
struct a
{
auto swap(a& a2) -> void;
};
auto swap(a& a1, a& a2) -> void
{
a1.swap(a2);
}
}
auto main(void) -> int
{
n::a a1, a2;
using std::swap;
swap(a1,a2); // use case 1
n::swap(a1,a2); // use case 2
}
到目前爲止,一切都很好,都使用的情況下正常工作,但後來,我加入用自己的交換方法的第二類,並決定通過轉動獨立交換到模板上樣板保存:
namespace n
{
struct a
{
auto swap(a& a2) -> void;
};
struct b
{
auto swap(b& b2) -> void;
};
template<class T>
auto swap(T& t1, T& t2) -> void
{
t1.swap(t2);
}
}
auto main(void) -> int
{
n::a a1, a2;
using std::swap;
swap(a1,a2); // use case 1
n::swap(a1,a2); // use case 2
}
這裏使用的情況下1條斷裂時,編譯器抱怨與std::swap
模板歧義。如果一個預期的問題,它可以定義swap
功能rahter比方法(它們通常是朋友,因爲他們更換方法):
namespace n
{
struct a
{
friend auto swap(a& a1, a& a2) -> void;
};
struct b
{
friend auto swap(b& b1, b& b2) -> void;
};
}
現在一切正常,所以在swap
的情況下,它是剛夠要記住使用比方法更好的朋友函數,但一般情況如何?是否有任何黑客,無論是骯髒的,這將讓編譯器明確地選擇n::foo<a>
(或在我們控制下的其他一些foo<a>
)在其他template<class T> foo
可見的情況下,無論是在全局命名空間還是由於某些using
子句,特別是如果後者是不是我們的修改?
A ** **劈爲'swap'是使第二'T&'不計免賠(如像'identity_t')所以名稱空間中的模板將比標準模板更專業...... –
Jarod42
我喜歡這個想法,但它似乎不起作用。對於建議的'template struct identity typedef T type; };使用 模板 identity_t =類型名身份 ::類型;'和交換修飾以'模板 自動交換(類型&T1,identity_t &T2) - > void'它是被選中的'的std :: swap' 。 –
確實,'s :: swap'不太專業......:/ – Jarod42