首页 > 解决方案 > 如何为 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。

我也有点困惑,因为这个答案声称它应该可以工作,而这个答案声称这样的过载是不可能的。

标签: c++templatesc++17overloading

解决方案


推荐阅读