问题是 lambda 不是类模板,它们只是成员调用运算符的常规类,即operator()
是模板化的。
当为泛型 lambda 推导模板参数时,这种区别并不明显(这是一件非常好的事情)。
所以在你的例子中,lambda
不是类模板,但您使用的语法将用于类,而不是成员函数。
如果您想显式指定 lambda 的模板参数,则需要说明您正在调用该成员operator()
of lambda
,并且您需要说它是一个要消除歧义的模板。
lambda.template operator()<Alignment::eight>(t.data(), t.size());
这是您的代码版本compiles.
#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.template operator()<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;
}