模板和typename语法

3

我实现了以下结构体来检索类成员参数:

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()>::Typepack<int>等效,但我的模板参数一直被拒绝为无效。
因此,typename getArgs<typename some_class<class_template_args>::member_function>::Type似乎不是正确的语法。有什么帮助吗?谢谢!
编辑:理想情况下,我不想实例化func1类的对象,并且已经成功地对我创建的其他函数做到了这一点...
例如: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>;
};

“Args…”是函数接受的类型包? - Ryan Haining
好的,你有一个名为func1<T>的函数对象,它的operator()接受一个类型为T的参数。你是否假设可调用对象的模板参数与可调用函数接受的类型相同? - Ryan Haining
是的,但我不想把它作为快捷方式使用... - dumb0
1个回答

1
在这一行上:
getArgs<typename func1<int>::operator()>::Type

"

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

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

我现在又遇到了一个错误:在 typename getArgs<decltype(&func1<int>::operator())>::Type y; 中,g++ 抱怨“Type”不是一种类型。 - dumb0
@dumb0 这段代码在我的电脑上可以运行。你的代码是什么样子的? - David G
绝对是编译失败:http://coliru.stacked-crooked.com/a/a21cfab5fe72b673/main.cpp test.cpp: 在函数'int main()'中: test.cpp:16:55: 错误:在'struct getArgs<int (func1<int>::*)(int)const>'中'Type'未命名为类型 typename getArgs<decltype(&func1<int>::operator())>::Type z; - dumb0
@dumb0 这很奇怪,在 Clang 中使用 constexpr 可以正常工作,但在 GCC 中却不行。 - David G
我有一种感觉,GCC(错误地)告诉我Type是一个值。也许GCC过于急切地评估了operator()。我应该提交一个错误报告吗? - dumb0
@dumb0 我不确定。你应该询问一下。 - David G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接