【问题标题】:C++ deduce member function parametersC++推导出成员函数参数
【发布时间】:2015-07-06 12:37:22
【问题描述】:

我希望扩展 here 描述的功能,但对于成员函数,这种情况下的语法是什么?

另外,模板定义中的 (*) 是否取消引用函数指针以便编译器可以推断模板参数?

不胜感激!

谢谢

template <class F> struct ArgType;

template <class R, class T> 
struct ArgType<R(*)(T)> {
  typedef T type;
}; 

void f(int) {}

#include <type_traits>
#include <iostream>

int main() {

  // To prove
  std::cout << std::is_same< ArgType<decltype(&f)>::type, int >::value << '\n';

  // To use
  ArgType<decltype(&f)>::type a;
}

【问题讨论】:

  • 模板定义中的* 只是函数指针语法的一部分。
  • 这是一个函数指针,你需要一个成员函数指针,即R(T::*)(Args...)
  • 分解成员函数类型通常在称为“成员函数(类型)特征”的情况下完成。 StackOverflow 上已经有几个实现; boost 也包含一个。
  • 感谢大家的投入!

标签: c++ templates function-pointers member-function-pointers


【解决方案1】:

指向成员的指针看起来像Ret (Cls::*)(Args...) [cv-qualifiers] [ref-qualifiers]。所以你可以扩展你的类来推断第一种类型:

template <class F> struct ArgType;

template <typename Ret, typename Cls, typename T, typename... Args>
struct ArgType<Ret (Cls::*)(T, Args...)> {
    using type = T;
};

请注意,您可以通过编写一个为您提供nth 参数的元函数来使其更通用:

template <typename Ret, typename Cls, typename... Args>
struct ArgType<Ret (Cls::*)(Args...)> {
    
    template <size_t N>
    struct get_arg {
        using type = typename std::tuple_element<N,
                        std::tuple<Args...>>::type;
    };
};

所以ArgType&lt;F&gt;::arg&lt;0&gt;::type 将是您寻找的类型。

【讨论】:

  • 加上各种 cv-qualifier/ref-qualifier/C varargs 变体;你需要 24 个部分专业化......
  • @T.C.为了理智而省略。
  • 感谢您的回复!非常有帮助,总是发现指向成员函数语法的指针有点绕口令 + 模板扔在那里,我的小脑袋无法应付。干杯!
  • 真的有人试过这个吗?它对我不起作用(“期望一个类型,得到'&Bar::doSomething'”)
  • @JeffTrull 对,你需要传递一个类型...decltype(&amp;Bar::doSomething)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多