Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过C&x2B+;20模板化的Lambda函数,然后调用它_C++_Templates_Lambda_C++20 - Fatal编程技术网

C++ 通过C&x2B+;20模板化的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)

我试图将一个模板化的lambda传递给一个函数,然后用一个模板参数调用它,以便为自定义类型启用该函数的专门化

但是当我尝试调用lambda时,我得到了以下错误:
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());
}