【问题标题】:Get type of arguments with one predefind argument使用一个预定义参数获取参数类型
【发布时间】:2022-01-06 17:01:31
【问题描述】:

在 c++ 中,我想获取函数参数的类型。 问题是我不想只获取第一个参数之后的所有参数的类型

template <typename T>
struct FuncTraits : FuncTraits<decltype(&T::operator())> {};

template <typename C, typename R, typename... Args>
struct FuncTraits<R(C::*)(Args...) const> : FuncTraits<void(*)(Args...)> {};

template <typename... Args> struct FuncTraits<void(*)(Args...)> {
    using ArgCount = std::integral_constant<std::size_t, sizeof...(Args)>;
    using ArgsType = std::tuple<typename std::decay<Args>::type...>;
};

在此示例中,它获取所有参数的类型,但我想要更多类似的东西

template <typename T>
struct FuncTraits : FuncTraits<decltype(&T::operator())> {};

template <typename C, typename R, typename... Args>
struct FuncTraits<R(C::*)(int, Args...) const> : FuncTraits<void(*)(int unused, Args...)> {};

template <typename... Args> struct FuncTraits<void(*)(int unused, Args...)> {
    using ArgCount = std::integral_constant<std::size_t, sizeof...(Args)>;
    using ArgsType = std::tuple<typename std::decay<Args>::type...>;
};

然而,这无法完成编译。 我如何实现这样的目标?

【问题讨论】:

  • 您应该只需要添加另一个模板参数,例如typename T,然后您将拥有FuncTraits&lt;void(*)(T unused, Args...)
  • 请包含完整的错误信息和所有警告。

标签: c++ visual-c++ c++20


【解决方案1】:

您可以在FuncTraits 的基本重载中添加另一个模板类型:

#include <iostream>
#include <typeinfo>

struct foo
{
    float operator ()(int a, char b, unsigned int c) const { return 0; }
};

template <typename T>
struct FuncTraits : FuncTraits<decltype(&T::operator())> {};

template <typename C, typename R, typename... Args>
struct FuncTraits<R(C::*)(Args...) const> : FuncTraits<void(*)(Args...)> {};

template <typename Arg, typename... Args> struct FuncTraits<void(*)(Arg, Args...)> {
    using ArgCount = std::integral_constant<std::size_t, sizeof...(Args)>;
    using ArgsType = std::tuple<typename std::decay<Args>::type...>;
};

int main()
{
    using FooTraits = FuncTraits<foo>;
    std::cout << FooTraits::ArgCount() << '\n'; \\ prints '2'
    std::cout << typeid(FooTraits::ArgsType).name() << '\n'; \\ prints 'class std::tuple<char,unsigned int>'
}

【讨论】:

    猜你喜欢
    • 2013-06-27
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多