gpt4 book ai didi

c++ - 将 C++20 模板化 Lambda 传递给函数,然后调用它

转载 作者:行者123 更新时间:2023-12-05 00:54:31 27 4
gpt4 key购买 nike

我正在尝试将模板化的 lambda 传递给函数,然后使用模板参数调用它,以启用该函数的自定义类型的特化。

但是当我尝试调用 lambda 时,我得到了这个错误:error: invalid operands to binary expression

这里有一个神 bolt 链接,供任何想玩这个的人使用:https://gcc.godbolt.org/z/qYPcea

#include <cstdint>
#include <string>
#include <cstring>

enum class Alignment : uint8_t {

one,
two,
four,
eight
};

template <Alignment alignment, typename T>
static void align(T& pointer)
{
intptr_t& value = reinterpret_cast<intptr_t&>(pointer);
value += (-value) & ((uint64_t)alignment - 1);
}

template<typename Lambda, typename T>
static void specialization(Lambda&& lambda, const T& t)
{
lambda<Alignment::eight>(t.data(), t.size());
}

int main()
{
uint8_t buffer[1024];

void *writeTo = buffer;

auto lambda = [&] <Alignment alignment> (const void *input, uint32_t inputSize) -> void
{
align<alignment>(writeTo);
writeTo = memcpy(writeTo, buffer, inputSize);
};

std::string input("helloworld");

specialization(lambda, input);

return 0;
}

最佳答案

问题在于 lambda 不是类模板,它们只是成员调用运算符(即 operator() 被模板化的常规类。

当为泛型 lambda 推导模板参数时,这种区别并不明显(这是一件非常好的事情)。

所以在您的示例中,lambda 不是类模板,但您使用的语法将用于类,而不是成员函数。

如果要显式指定 lambda 的模板参数,则需要说明您正在调用 lambda 的成员 operator(),并且你需要说它是一个消除歧义的模板。

lambda.template operator()<Alignment::eight>(t.data(), t.size());

这是您的代码版本 compiles .

关于c++ - 将 C++20 模板化 Lambda 传递给函数,然后调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66111254/

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