C++具有ADL(參數相關查找),正如其名稱所描述的那樣,函數的上下文(名稱空間)可以從參數(的任何一個)的上下文(名稱空間)隱含。針對參數相關查找的逆變換的解決方法?
fun(a); // if the type of a is in namespace ns deduce ns::f if available
我的問題是,如果反過來也有可能通過某種技術?相反,我的意思是如果上下文(名稱空間)可以從被調用函數的上下文中推導出來。某種「功能依賴查找」(FDL)。僞代碼:
ns::fun(a); // deduce ns::a if available
我找不出一個辦法。這個限制對用於編碼功能選項的enum
特別惱人。我想知道是否有一種技術來模擬此功能(C++ 11也可以)。僞代碼:
ns::fun(Saturday, Tuesday); // Saturday/Tuesday are enum values in namespace ns;
尤其是如果有解決方法enum
s。
此代碼說明了問題:
namespace longname{
class A{};
void fun(A const& a){}
A global_a;
enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
void gun(Days d1, Days d2){}
}
int main(){
longname::A a;
fun(a); // cool, longname::fun(a) not necessary, fun is deduced from context
longname::fun(global_a); // error, not cool, global_a context not deduced,
// must use then longname::fun(longname::global_a)
longname::gun(Saturday, Tuesday); // error, particularly not cool, the Saturday is not deduced from context
// must use then longname::gun(longname::Saturday, longname::Tuesday)
// or at best gun(longname::Saturday, longname::Tuesday)
}
編輯: @jrok提出了一種基於嵌套定義命名空間的解決方法。對於enum
的情況,我得到了這個代碼。這仍然有一些噪音(根本沒有「依賴」查找),但這是一個改進。
namespace longname{
namespace days{
enum _ { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday};
}
void gun(days::_ d1, days::_ d2){}
}
int main(){
using namespace longname::days; // some noise still here
longname::gun(Saturday, Tuesday);
}
我不使用
enum class
因爲那時
Saturday
,
Sunday
等不能直接布拉夫範圍是
(其實using longname::days::_
會給我一個編譯錯誤)
OK,提交我的問題後,我得到了正確的面板上的相關問題http://stackoverflow.com/questions/14163667/why-does-c11-not-support-name-lookup-like-此?RQ = 1。可以說,這裏的區別在於我不是在質疑語言,但我正在尋找解決方法。 – alfC
解決方法:將枚舉置於嵌套名稱空間中,並在'main'中聲明'using namespace longname :: nested;'。 – jrok
@jrok,酷,讓一個更接近解決方案(我對你的問題添加了你的建議)。 – alfC