【发布时间】:2014-01-03 05:21:54
【问题描述】:
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
我想不出办法。对于用于编码函数选项的enums,此限制尤其令人讨厌。我想知道是否有一种技术可以模拟这个特性(C++11 也可以)。假代码:
ns::fun(Saturday, Tuesday); // Saturday/Tuesday are enum values in namespace ns;
特别是如果enums 有解决方法。
这段代码说明了这个问题:
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::_会给我一个编译错误)
【问题讨论】:
-
好的,提交我的问题后:我在右侧面板stackoverflow.com/questions/14163667/… 上收到了相关问题。可以说,这里的不同之处在于我不是在质疑语言,而是在寻找一种解决方法。
-
解决方法:将枚举放在嵌套命名空间中,并在
main中输入using namespace longname::nested;。 -
@jrok,很酷,这更接近解决方案(我在问题中添加了您的建议)。
-
namespace Longname { enum class Days { Saturday, Monday, Odinsday }; } using Longname::Days; Longname::func( Days::Saturday, Days::Odinsday );? -
@Yakk,谢谢我在我的编辑中添加了类似的内容,
enum class与enum相比,更难去除噪音(但出于其他原因是必要的)。
标签: c++ c++11 enums namespaces argument-dependent-lookup