c++ - 如何为 lambda 和标量引用重载模板函数
问题描述
我想用几种参数类型重载模板函数:
class Helper {
public:
// For integral types and pointers
template<typename T>
void GetValue(const char* name, T& value) const
{
value = someFunction();
}
template<typename T>
void GetValue(const char* name, gsl::span<T> value) const
{
value.fill();
}
template<typename T, std::size_t N>
void GetValue(const char* name, T (&value)[N]) const {
GetValue(name, gsl::make_span(value, N));
}
template<typename Fn, typename T, std::enable_if_t<std::is_invocable_v<Fn, T>, bool> = true>
void GetValue(const char* name, const Fn initializer) const
{
T value;
GetValue<T>(name, value);
initializer(value);
}
};
它适用于整数类型,但只要我想用 lambda 函数调用这个模板,它就不会:
Helper helper;
// Must work with capturing and non-capturing lambdas
helper.GetValue("SomeName", [&]( const char* str ) { /* do something special */ });
// results in
// no matching overloaded function found
如您所见,我尝试使用 SFINAE 来约束模板参数,但这无济于事。编译器是带有 /MD -std:c++17 的 MSVC 2019。
解决方案
推荐阅读
- python-3.x - 多天阅读 CSV 文件,但错过了几天
- tensorflow - 在 tensorflow2.0 中哪里可以找到手动拟合的损失函数?
- javascript - 图像在过滤列表中自行卸载
- python - 可以解析作为文本输入给出的场景并返回步骤列表的任何内置方法
- java - 开始播放多播流时的 VideoView 延迟(有时)
- ios - 我已使用桥接头将 Objective-C 文件导入到 Swift 项目中,但出现“预期类型”错误
- python - 时间戳中的小数部分是什么?
- c++ - 堆上是否分配了变量?
- c# - 升级到 Microsoft.NETCore.App 后 ASP.NET Core 硬崩溃
- node.js - 错误 [ERR_HTTP_HEADERS_SENT]:在 Express.js 中将标头发送到客户端后无法设置标头