gpt4 book ai didi

c++ - 匹配自定义仿函数或 stod、stoi 等的模板

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:34 25 4
gpt4 key购买 nike

我正在尝试将键值参数作为 string 存储在名为 ModelConfig 的类中。然后我想自动将这些值转换为特定类型,使用自定义转换函数或使用标准函数 stodstofstoi 和类似。

如果我提供自定义转换函数,我的类会成功解析参数,但我不知道如何接受标准函数。这是我的方法:

class ModelConfig
{
public:
ModelConfig(void) = default;

void addParam(std::string pname, std::string pvalue) {
m_params[pname] = pvalue;
}

template <class F, typename... Args, class T = typename std::result_of<F&&(const std::string&, Args...)>::type>
T getParam(std::string pname, F&& pconv_functor) const
{
return pconv_functor(m_params.at(pname));
}

private:
std::map<std::string, std::string> m_params;
};

上面的类,可以通过以下方式进行测试:

#include <iostream>
#include <map>
#include <functional>
#include "ModelConfig.hpp"

int main(void)
{
ModelConfig mc;
mc.addParam("p1_float", "123.4");
mc.addParam("p2_double", "56.7");
mc.addParam("p3_bool", "true");
mc.addParam("p4_int", "-321");

auto functord = [](const std::string& s) {
return std::stod(s);
};

std::cout << mc.getParam("p2_double", functord) << "\n"; // OK.
std::cout << mc.getParam("p2_double", std::stod) << "\n"; // Error.

return 0;
}

我如何修改 getParam 以接受第一个参数是 string 但其他参数可以有默认值的函数?

最佳答案

std::stod 被重载,因此编译器无法推断要使用哪个函数。

您可以使用宏来编写通用包装器:

#define wrapper(f) \
( [] (auto&&... args) -> decltype(auto) { \
return f(std::forward<decltype(args)>(args)...); \
} )

然后调用它:

std::cout << mc.getParam("p2_double", wrapper(std::stod)) << "\n"; 

关于c++ - 匹配自定义仿函数或 stod、stoi 等的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51158534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com