我的功能看起来或多或少是这样的:
template<class C> auto f(C const& c) -> decltype(begin(c)){
using std::begin;
return begin(c);
}
该函数的主体利用&#34; using
并使用&#34;成语和
感谢decltype
,如果返回类型无效,则为SFINAE。
然而,它一般不完美,因为我无法告诉decltype
using std
begin
声明。
template<class C> auto f(C const& c) -> decltype(std::begin(c))
也会不一致,例如当decltype(c)
和begin
属于不同的命名空间时。
周围有什么方法吗?
理想情况下,我想要像
这样的东西template<class C> auto f(C const& c) -> decltype(using std::begin; begin(c))
我认为lambda原则上可以工作
template<class C> auto f(C const& c) -> decltype([&]{using std::begin; return begin(c)})
但decltype
内禁止使用lambdas。
在GCC中有一个有趣的语言扩展(&#34;表达式语句&#34;)是有希望的,但是它不能在函数体外工作(与未评估的上下文中不允许使用lambdas相同) )。 否则这将是一个解决方案。
template<class C> auto g(C const& c)
->decltype(({using std::begin; begin(c);})){ // ...that doesn't work here
return(({using std::begin; begin(c);})); // gcc extesion...
}
答案 0 :(得分:5)
您可以委派给支持ADL的命名空间
namespace detail
{
using std::begin;
template<class C> auto f(C const& c) -> decltype(begin(c)){
return begin(c);
}
}
template<class C> auto f(C const& c) -> decltype(detail::f(c)){
return detail::f(c);
}