C++ には ADL (Argument Dependent Lookup) があり、その名前が示すように、関数のコンテキスト (名前空間) を引数 (のいずれか) のコンテキスト (名前空間) から暗示することができます。
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
関数のオプションをエンコードするために使用される s にとって特に厄介です。この機能をシミュレートする手法があるかどうか知りたいです (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::_