在未评估的上下文中获取成员参数函数的返回类型

时间:2014-06-03 19:54:05

标签: c++ templates c++11

给出以下代码(复杂代码的情况减少):

#include <type_traits>

template<unsigned i>
struct index_st
{
    using type = void;
};

struct pack
{
    template<unsigned index>
    static typename index_st<index>::type get();

    template<unsigned index>
    using unpack_t = decltype(get<index>());
};

template<typename P, unsigned index>
struct unpack
{
    using type = typename P::unpack_t<index>;
};

int main()
{
    unpack<pack, 3> u;
}

gcc(4.8.1)抛出以下编译错误:

sample.cpp:21:38: error: expected ';' before '<' token
     using type = typename P::unpack_t<index>;
                                      ^
sample.cpp:21:38: error: expected unqualified-id before '<' token
sample.cpp: In instantiation of 'struct unpack<pack, 3u>':
sample.cpp:26:21:   required from here
sample.cpp:21:38: error: 'typename pack::unpack_t' names 'template<unsigned int index> using unpack_t = decltype (get<index>())', which is not a type

我的目标是获取pack::get<index>()结构中unpack返回的类型。

我已尝试使用using语句,使用std::result_of和其他组合来执行此操作,但在所有情况下,我都无法获得{{的返回类型1}}(参数化成员函数)。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

 using type = typename P::unpack_t<index>;

此处Pdependent type(因为它是模板参数),这意味着必须明确告知编译器将unpack_t视为模板。

 using type = typename P::template unpack_t<index>;

更多信息: