模板和typename语法

时间:2014-12-07 17:19:38

标签: c++ syntax alias template-meta-programming

我实现了以下struct来检索类成员参数:

template<typename...T>
class pack{};

template<typename...T>
struct getArgs{};
template<typename C,typename R,typename...Args>
struct getArgs<R(C::*)(Args...)>{using Type=pack<Args...>;};

但我不确定使用它的语法。

如果我将课程func1定义为:

template<typename T>
struct func1{
    constexpr T operator()(T x){return x+1;}
};

我希望typename getArgs<typename func1<int>::operator()>::Type等同于pack<int>,但我的模板参数一直被拒绝为无效。

所以typename getArgs<typename some_class<class_template_args>::member_function>::Type 似乎不是正确的语法。有帮助吗?谢谢!

编辑:我理想情况下不想实例化func1类的对象,并且已经成功地为我创建的其他函数做了...

E.g。 typename getN<1,pack<float,int> >::Type x;的作用为float x;

template<std::size_t N,typename T,typename...Args>
struct getN_help:getN_help<N-1,Args...>{};
template<typename T,typename...Args>
struct getN_help<1,T,Args...>{using Type=T;};


template<std::size_t N,typename T>
struct getN;
template<std::size_t N,typename T,typename...Args>
struct getN<N,pack<T,Args...> >{
    using Type=pack<typename getN_help<N,T,Args...>::Type>;
};

1 个答案:

答案 0 :(得分:1)

在这一行:

getArgs<typename func1<int>::operator()>::Type

typename func1<int>::operator()不是一种类型,它是一种功能。您需要在指向它的指针上调用decltype()。使用operator&获取指向成员的指针:

getArgs<decltype(&func1<int>::operator())>::Type