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

标签 c++ templates lambda c++20

我正在尝试将模板化的 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/

相关文章:

c++ - 包装右值引用 lambda 时 std::async 和 std::bind 之间的区别

c++ - 默认 lambda 作为函数的模板化参数

c++ - 为什么调用另一个对象的析构函数?

c++ - xcode 7 如何抑制警告 "overrides a member function but is not marked ' override'”

可变参数模板扩展期间的 C++ 类型索引

c++ - C++ 模板参数上的“if”语句

c++ - C++ 编译器是否对 lambda 闭包执行编译时优化?

c++ - 如何在qt/c中打印所有小数的long double?

c++ - 一对<int,pair<int,int>>优先级队列的自定义比较器

templates - 更改生成的代码 'Check if parameter is null'