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;
特别是如果 s 有解决方法enum
。
这段代码说明了这个问题:
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
因为 then Saturday
, Sunday
, etc 不能直接在范围内进行(实际上using longname::days::_
会给我一个编译错误)