c++ - 将 'using std::foo' 指令应用于本地构造函数初始化程序列表 (C++)

标签 c++ c++11 using using-directives

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

// 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/

相关文章:

c++ - C++ 模板能否确定正在声明/定义的实例是否为常量?

c++ - 如何正确使用可变参数模板的引用

javascript - 使用 javascript 获取复选框状态

C++:使用 LSD 基数排序崩溃的字符串排序

c++ - 来自 std::string 的 std::istringstream 而无需复制

c++ - 使用 Qt 和 QThread 的简单数字时钟

c# - 我可以在 C# *using* block 中使用不同类型的对象吗?

c++ - 如何使用指针 C++ 将二维数组中的元素复制到一维数组中

c++ - 将成员函数传递给 std::signal

c# - 如何避免在 C# 类之前编写命名空间