在decltype

时间:2018-05-21 20:56:26

标签: c++ c++11 decltype argument-dependent-lookup using-declaration

我的功能看起来或多或少是这样的:

template<class C> auto f(C const& c) -> decltype(begin(c)){
    using std::begin;
    return begin(c);
}
  1. 该函数的主体利用&#34; using并使用&#34;成语和

  2. 感谢decltype,如果返回类型无效,则为SFINAE。

  3. 然而,它一般不完美,因为我无法告诉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...
    }
    

1 个答案:

答案 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);
}