尾随返回类型中的名称查找问题

时间:2016-01-27 11:32:10

标签: c++ c++14 template-meta-programming argument-dependent-lookup trailing-return-type

以下示例说明了我的问题:

#include <iostream>
#include <string>

template <typename T>
auto func(const T& x) -> decltype(to_string(x)) {
  using std::to_string;
  return to_string(x);
}

int main() {
  std::cout << func(1);
}

我不想将std::to_string导入全局命名空间,我不想使用-> decltype(std::to_string(x))这样做会禁用ADL。显然,您无法将using std::to_string置于decltype之内。那么,我该怎么做呢?

1 个答案:

答案 0 :(得分:6)

推迟到另一个名称空间;

namespace activate_adl {
  using std::to_string;
  template <typename T>
  auto func(const T& x) -> decltype(to_string(x)) {
    return to_string(x);
  }
}

template <typename T>
auto func(const T& x) -> decltype(activate_adl::func(x)) {
  return activate_dl:: func(x);
}

这样可以完成ADL,但不会污染全局命名空间。

使用一些std相关函数和ADL几次遇到此问题后,我发现延迟命名空间(命名良好)是合适的替代方案。