将重载函数(如std::stoll)打包到std::函数中
packaging an overloaded function (like std::stoll) into std::function
我很难将std::stoll
打包到std::function
中。天真的
std::function<std::int64_t(std::string const&)> obj = std::stoll;
失败的原因是std::stoll
是两个函数的重载(cppreference在询问时没有提到(,一个函数将std::string
和另一个std::wstring
作为第一个参数。那么我怎样才能得到我想要的呢?
我知道我可以使用调用std::stoll
的lambda,但我正在寻找形式的解决方案
auto parser = ???
std::function<std::int64_t(std::string const&)> obj{parser};
您可以强制转换一个重载函数指针来消除歧义:
function<int64_t(string const&)> obj =
static_cast<int64_t(*)(string const&)>(stoll);
编辑:您还需要绑定默认参数,因为stoll
是一个三参数函数,并且您试图使它只接受一个参数:
function<int64_t(string const&)> obj =
std::bind(static_cast<int64_t(*)(string const&, size_t*, int)>(stoll),
placeholders::_1, nullptr, 10);
将其封装在函子中:
struct StringToLongLong {
long long operator () (const std::string& s) const { return stoll(s); }
long long operator () (const std::wstring& s) const { return stoll(s); }
};
std::function<std::int64_t(std::string const&)> obj = StringToLongLong();
注意:函子可能是在函数中局部定义的。
如果函数中的函子不是(!(局部类(请参见@MSchangers注释(:
struct StringToLongLong {
template <typename String>
long long operator () (const String& s) const { return stoll(s); }
};
std::function<std::int64_t(std::string const&)> obj = StringToLongLong();
注意:如果函数是在函数中本地定义的,则成员模板无效。
这看起来像是重载集的问题。在保存decltype
时用C++1y编写
#define OVERLOAD_SET(F) struct {
template<typename...Args> auto operator()(Args&&...args)const{
return (F)(std::forward<Args>(args)...);
}
}
现在我们可以了
static OVERLOAD_SET(std::stoll) os_stroll;
并且CCD_ 9可以被传递给CCD_。
如果你喜欢,你甚至可以启用ADL:
#define ADL_OVERLOAD_SET(NS, F) struct {
template<typename...Args> auto operator()(Args&&...args)const{
using NS::F;
return F(std::forward<Args>(args)...);
}
}
另一个可选改进:
/* cast to function pointer. Copy paste for each calling convention */
template<typename R, typename Args...>
operator R(*)(Args...)() const {
return [](Args...args){return (F)(std::forward<Args>(args)...);};
}
或者对接受什么Args...
更严格一点(如果类型转换,上面会返回一个函数指针。它可能还应该执行SFINAE以生成早期的失败(。
相关文章:
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数