给定一个自定义类型,以下片段显示了允许函数自动选择用户提供的特定于该类型的重载的常用方法,或者如果不是,则从标准库中选择函数的通用实现。
// assume std::foo is a real function template returning an int
namespace a {
struct b { };
int foo(b& ab) { ... }
}
int bar(a::b& ab)
{
using std::foo;
return foo(ab);
}
此方法将自动选择 a::foo
优先于 std::foo
(如果存在)。
我的问题是,当所讨论的调用是构造函数的初始化程序列表的一部分时,是否有可能实现类似的行为?
struct bar2
{
bar2(a::b& ab);
int i;
};
bar2::bar2(a::b& ab)
: i{foo(ab)} // want a::foo if available, else std::foo
{ }
显然将 using std::foo
放在构造函数主体中为时已晚。但是,如果我将它放在构造函数定义之前,我会将 std::foo
引入全局命名空间,这也是不可取的。
在这种情况下,有什么办法可以两全其美?
最佳答案
根据Can a using statement appear in a constructor initialization list?一种解决方法是使用私有(private)静态函数,如下所示:
struct bar2
{
bar2(a::b& ab);
int i;
private:
static int wrapper(a::b& f)
{
using std::foo;
return foo(f);
}
};
bar2::bar2(a::b& ab)
: i{wrapper(ab)} // want a::foo if available, else std::foo
{ }
在这种情况下,您可以保留初始化列表的好处,而无需将初始化移动到构造函数的主体。上面链接的问题中的 OP 声称它不提供 ADL,但它 seems to work for me .要测试,只需删除:
int bar(foo f)
{
std::cout << "custom.\n";
return 0;
}
关于c++ - 将 'using std::foo' 指令应用于本地构造函数初始化程序列表 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21420082/