gpt4 book ai didi

c++ - 是否可以从(Functor 成员的)函数签名中检索参数类型以用于模板?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:49 25 4
gpt4 key购买 nike

假设你有一个仿函数:

struct MyFunctor
{
bool operator ()( int value )
{
return true;
}
};

是否可以检索仿函数成员的参数类型以在您的模板中使用?以下是这个神秘功能的用法:

template < typename FunctorType >
bool doIt( FunctorType functor, typename FunctorType::operator()::arg1 arg )
{
return functor( arg );
}

是否有有效的语法可以替代我神话般的 FunctorType::operator()::arg1

最佳答案

如果您知道该项目是一个仿函数,那么您可以直接获取它的 operator(),如下所示:

#include <iostream>

template <unsigned Idx, typename... T>
struct pick
{
static_assert(Idx < sizeof...(T), "cannot index past end of list");
};

template <typename T, typename... TRest>
struct pick<0U, T, TRest...>
{
typedef T result;
};

template <unsigned Idx, typename T, typename... TRest>
struct pick<Idx, T, TRest...>
{
typedef typename pick<Idx-1, TRest...>::result result;
};

template <typename Func>
struct func_traits;

template <typename TObj, typename R, typename... TArgs>
struct func_traits<R (TObj::*)(TArgs...)>
{
typedef R result_type;

template <unsigned Idx>
struct argument
{
typedef typename pick<Idx, TArgs...>::result type;
};
};

template <typename Func,
typename Traits = func_traits<Func>,
typename R = typename Traits::result_type,
typename Arg0 = typename Traits::template argument<0>::type,
typename Arg1 = typename Traits::template argument<1>::type
>
void foo(Func f)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
};

struct thing
{
void operator()(long, int*) { }
};

int main()
{
foo(&thing::operator());
}

对我来说,该程序打印出:

void foo(Func) [with Func = void (thing::*)(long int, int*), Traits = func_traits<void (thing::*)(long int, int*)>, R = void, Arg0 = long int, Arg1 = int*]

关键是Arg0Arg1分别是longint*

关于c++ - 是否可以从(Functor 成员的)函数签名中检索参数类型以用于模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6667449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com