gpt4 book ai didi

c++ - 我在哪里可以找到,或者我如何创建一个优雅的 C++ 成员函数模板包装器机制而不需要 resporting to boost?

转载 作者:行者123 更新时间:2023-11-28 04:00:29 25 4
gpt4 key购买 nike

我希望能够在成员函数上模板化类,而无需重复成员函数的参数——即,自动派生它们。如果我根据函数采用的参数数量来命名类,我知道如何做到这一点,但我也想派生它。

类似这样的东西,虽然这不起作用(至少在我的目标编译器 MSVC 2008 sp1 中):

class Foo {
void func0();
int func2(char *, float);
};

template<typename T> class Wrapper;

// specialize for zero-argument void func
template<typename Host, void (Host::*Func)()> class Wrapper<Func> : public Base {
... specialization goes here ...
};

// specialize for two-argument value func
template<typename Host, typename Ret, typename Arg0, typename Arg1, Ret (Host::*Func)(Arg0, Arg1)> class Wrapper<Func> : public Base {
... specialization goes here ...
};

通过“Base”,我可以多态地处理这些。最后,我想用它来为脚本语言创建一个简单的包装器语法:

WrapClass<Bar> wrap(
MemberFunction<&Bar::func0>("func0") +
MemberFunction<&Bar::func2>("func2")
);

但是,这不起作用:特化语法是错误的,因为您无法将函数指针与类型名参数相匹配。

最佳答案

我相信您需要采用 traits 方法,其中最常见的库是 boost 的,但是如果您想避免 boost,那么如果您限制了仅实现指向成员函数的指针和所需函数的特征(modern c++ design 是一本解释该理论的好书)。下面是我如何使用 boost 的 function_traits 和 enable_if 来实现。

您可以使用通用模板参数,为函数指针启用_if,然后使用函数类型(或类型特征)提取您需要的信息:

#include <boost/function_types/function_arity.hpp>
#include <boost/function_types/is_member_pointer.hpp>

template<typename T, class Enable = void> class Wrapper;

/* other specializations... */

// For member functions:
template <class T>
class Wrapper<T, typename enable_if<is_member_pointer<T> >::type>
{ /* function_arity<T>::value has the number of arguments */ };

参见 thisthis

关于c++ - 我在哪里可以找到,或者我如何创建一个优雅的 C++ 成员函数模板包装器机制而不需要 resporting to boost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/991640/

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