在本地将 'using std::foo' 指令应用于构造函数初始值设定项列表 (C++)



给定自定义类型,以下片段显示了允许函数自动选择特定于该类型的用户过载或从标准库中函数的通用实现的通用方法如果不是。

// 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介绍给也不需要的全局名称空间。

在这种情况下有什么方法可以在两全其美?

根据使用语句可以显示在构造函数初始化列表中吗?周围的一项工作是使用私有静态函数这样:

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,但似乎对我有用。要测试,只需删除:

int bar(foo f)
{
    std::cout << "custom.n";
    return 0;
}

最新更新