gpt4 book ai didi

c++ - 如何将此宏转换为函数模板?

转载 作者:搜寻专家 更新时间:2023-10-31 01:11:58 25 4
gpt4 key购买 nike

在使用绑定(bind)实现调度表的过程中,我试图用函数模板替换宏

一旦我开始添加用于返回 std::stringdouble 的表,我会非常喜欢模板版本。

宏版本工作正常,但模板版本转储核心。

有人可以解释我做错了什么吗?谢谢。

代码

#include <functional>
#include <iostream>
#include <map>

struct Integer
{
virtual int getInt() const = 0;
};

struct IntImpl : public Integer
{
virtual int getInt() const { return 42; }
};

typedef std::function<int()> IntFunction;
typedef std::function<IntFunction( Integer const& inst )> IntLambda;

#define USE_MACRO

#ifdef USE_MACRO
#define MP(A,B) \
std::make_pair( A, []( Integer const& inst ) { \
return std::bind( B, std::cref( inst )); \
} )
#else
template<typename L,typename T,typename M>
std::pair<std::string,L>
MP( std::string const& str, M method)
{
return std::make_pair( str, [&method]( T const& inst ) {
return std::bind( method, std::cref( inst ));
}
);
}
#endif

static std::map<std::string,IntLambda> const g_intTbl =
{
#ifdef USE_MACRO
MP( "getInt", &Integer::getInt )
#else
MP<IntLambda,Integer>( "getInt", &Integer::getInt )
#endif
};

int
main( int argv, char* argc[] )
{
IntImpl x;
std::cerr << g_intTbl.find("getInt")->second( x )() << std::endl;
}

最佳答案

您的问题在于如何将 method 捕获到您的 lambda 中。您正在通过引用捕获 method,它引用本地方法参数,即堆栈上的一个值。 return std::bind() 在调用该函数之前不会执行,此时它将尝试将引用绑定(bind)到显然不再存在的堆栈变量。

您只需将 [&method] 更改为 [method] 即可按值捕获。

关于c++ - 如何将此宏转换为函数模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14188503/

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