gpt4 book ai didi

c++ - Lambda 函数模板转换失败

转载 作者:行者123 更新时间:2023-11-30 02:55:06 25 4
gpt4 key购买 nike

嗨@所有人,我们必须实现以下函数调用:

std::mt19937 engine;
color_table lut = create_random_color_map(engine);



发动机必须是可更换的。我们尝试以这种方式实现它:
*.hpp

#include <tuple>
#include <random>

typedef std::tuple<unsigned char,unsigned char,unsigned char> rgb_tuple;

class color_table{
public:
[...]
void generate(rgb_tuple predicate(const unsigned char& index));





};
template <class RANDOM>
static rgb_tuple random_color(RANDOM engine){
std::uniform_int_distribution<int> dist1 (0,255);
unsigned char red = (unsigned char) dist1();
unsigned char green = (unsigned char) dist1(engine);
unsigned char blue = (unsigned char) dist1(engine);
return std::make_tuple(red, green, blue);
}

template <class RANDOM>
static color_table create_random_color_map(RANDOM engine){
color_table lut;
lut.generate([&](const unsigned char& i)->rgb_tuple {
return random_color<decltype(engine)>(engine);
} );
return lut;
}

*.cpp

...
void color_table::generate(rgb_tuple predicate(const unsigned char& index)){
for(int i = 0; i < 256; ++i){
std::tie(red_table[i], green_table[i], blue_table[i]) = predicate(i);
}
}

当我们尝试编译时,出现以下错误:

error C2664: 'color_table::generate': Convertion of the parameter 1 from 'create_random_color_map::' to 'rgb_tuple (__cdecl *)(const unsigned char &)' not possible 1>
No userdefined convertionoperator available, that can execute the convertion or the operator cannot be invoked. ... Function-template "color_table create_random_color_map(RANDOM)". with [
RANDOM=std::mt19937 ]

我们对这次失败一无所知,在那种情况下谷歌不是我们的 friend ! :/

我们感谢任何帮助!

问候海米尔

最佳答案

第一个(主要)问题:

您的函数 generate() 接受一个函数指针 作为其参数,并且您正在尝试传递一个捕获 lambda。不幸的是,捕获的 lambda 不能隐式转换为函数指针。根据 C++11 标准的第 5.1.2/6 段:

The closure type for a lambda-expression with no lambda-capture has a public non-virtual non-explicit const conversion function to pointer to function having the same parameter and return types as the closure type’s function call operator. The value returned by this conversion function shall be the address of a function that, when invoked, has the same effect as invoking the closure type’s function call operator.

你可以改变你的设计,让 generate() 成为一个函数模板,接受一个可调用对象作为它的参数:

 class color_table{
public:
template<typename P>
void generate(P predicate);
};

或者,您可以使用 std::function 包装器来实现灵 active ,而无需重复使用模板(但有一些运行时开销):

#include <functional> // <== NEEDED FOR std::function

class color_table{
public:
void generate(std::function<rgb_tuple(const unsigned char&)> predicate);
};

这是一个live example显示使用上述解决方案编译的代码。

第二个(小)问题:

您不应明确指定 random_color() 的模板参数。而是让编译器完成它的工作并执行类型推导:

lut.generate([&](const unsigned char& i)->rgb_tuple {
return random_color(engine);
// ^^^^^^^^^^^^^^^^^^^^^
});

关于c++ - Lambda 函数模板转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16680992/

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