C++ 通过C&x2B+;20模板化的Lambda函数,然后调用它
我试图将一个模板化的lambda传递给一个函数,然后用一个模板参数调用它,以便为自定义类型启用该函数的专门化 但是当我尝试调用lambda时,我得到了以下错误:C++ 通过C&x2B+;20模板化的Lambda函数,然后调用它,c++,templates,lambda,c++20,C++,Templates,Lambda,C++20,我试图将一个模板化的lambda传递给一个函数,然后用一个模板参数调用它,以便为自定义类型启用该函数的专门化 但是当我尝试调用lambda时,我得到了以下错误:error:二进制表达式的操作数无效 这里有一个godbolt链接,供任何想玩这个游戏的人使用: #包括 #包括 #包括 枚举类对齐:uint8\t{ 一,, 二,, 四,, 八 }; 模板 静态空心对齐(T和指针) { intptr\u t&value=重新解释强制转换(指针); 值+=(-value)和((uint64_t)对齐-1)
error:二进制表达式的操作数无效
这里有一个godbolt链接,供任何想玩这个游戏的人使用:
#包括
#包括
#包括
枚举类对齐:uint8\t{
一,,
二,,
四,,
八
};
模板
静态空心对齐(T和指针)
{
intptr\u t&value=重新解释强制转换(指针);
值+=(-value)和((uint64_t)对齐-1);
}
模板
静态无效专门化(Lambda和Lambda,常量T&T)
{
lambda(t.data(),t.size());
}
int main()
{
uint8_t缓冲器[1024];
void*writeTo=缓冲区;
自动lambda=[&](常量void*input,uint32\u t inputSize)->void
{
对齐(写入);
writeTo=memcpy(writeTo、buffer、inputSize);
};
字符串输入(“helloworld”);
专门化(lambda,输入);
返回0;
}
问题在于lambda不是类模板,它们只是成员调用操作符的常规类,即操作符()
是模板化的
当为通用lambda推导模板参数时,这种区别并不明显(这是一件非常好的事情)
因此,在您的示例中,lambda
不是类模板,但您使用的语法将用于类,而不是成员函数
如果要显式指定lambda的模板参数,则需要说明您正在调用lambda
的成员operator()
,并且需要说明它是要消除歧义的模板
lambda.template operator()<Alignment::eight>(t.data(), t.size());
lambda.template操作符()。我听说你的lambda有问题,孩子
你有没有考虑过用。。。再来点兰巴斯
template<auto k>
constexpr std::integral_constant<std::decay_t<decltype(k)>, k> constant = {};
auto TemplateInvoke = [](auto&& f) {
return [&](auto...constants) {
return [&](auto&&...args)->decltype(auto) {
return f.operator()<decltype(constants)::value...>(decltype(args)(args)...);
};
};
};
模板
模板
静态无效专门化(Lambda和Lambda,常量T&T)
{
TemplateInvoke(lambda)(常量)(t.data(),t.size());
}
使用更多的lambda可以解决lambda的所有问题
问题是lambda(stuff)
不起作用;您需要lambda.operator()(stuff)
。这种语法很难理解
以上试图通过创建一个不同的C++方言来减少它的尴尬程度,其中将模板参数作为函数参数传递。
有些人可能会认为这是多余的。
他们可能是那种认为“一个lambda返回一个lambda并将一个lambda作为参数的lambda”由于语法歧义之外的原因而令人困惑的人。次要的是,第一句中的“kid”并不总是翻译得很好,可以被视为赞助人。你可能想避免它。啊哈,这就是lambda演算
template<auto k>
constexpr std::integral_constant<std::decay_t<decltype(k)>, k> constant = {};
auto TemplateInvoke = [](auto&& f) {
return [&](auto...constants) {
return [&](auto&&...args)->decltype(auto) {
return f.operator()<decltype(constants)::value...>(decltype(args)(args)...);
};
};
};
template<typename Lambda, typename T>
static void specialization(Lambda&& lambda, const T& t)
{
TemplateInvoke(lambda)(constant<Alignment::eight>)(t.data(), t.size());
}