我有以下简化的代码,其中编译器无法识别数据类型,我不确定为什么。在代码中,我希望能够传递一个映射,其中的关键字可以是std::string
,char
或int
。我还希望用户能够选择关联的值是float
还是double
。另外,基于关联值的类型,我希望返回的值是std::vector<float>
或std::vector<double>
。由于数据类型的可变性,我选择将此问题编码为模板。
// main.cpp
#include "test.hpp"
#include <iostream>
#include <math.h>
#include <map>
#include <tuple>
double func6(std::map<char, double> arr);
int main(int argc, const char * argv[]) {
std::map<char, double> inputs;
inputs['x'] = 2.0;
inputs['y'] = 5.438;
std::tuple<std::vector<double>, std::vector<double>> answer;
ODESolver q;
answer = q.ode_solver(inputs, func6);
// - The line below this was tried and it did not work
// any better than the line of code above this.
// answer = q.ode_solver<char, double>(inputs, func6);
return 0;
}
double func6(std::map<char, double> arr)
{
return arr['y'] * log(arr['y']) / arr['x'];
}
.hpp文件具有以下信息。
#ifndef test_hpp
#define test_hpp
#include <stdio.h>
#include <tuple>
#include <vector>
#include <map>
#include <functional>
class ODESolver
{
public:
template<class char_type, class real_type>
static inline std::tuple<std::vector<real_type>, std::vector<real_type>>
ode_solver(std::map<char_type, real_type> &inputs,
const std::function<real_type(std::map<char_type, real_type>)>& func)
{
// - This function does not work with the function call
// as written
// - The code in this function is irrelevant, it was just
// created to have returnable information of the correct
// type to test the function call
std::vector<real_type> one = {0.0, 1.0};
std::vector<real_type> two = {0.0, 1.0};
std::tuple<std::vector<real_type>, std::vector<real_type>> three(one, two);
return three;
}
};
#endif /* test_hpp */
编译器不允许上面显示的模板,因为它无法识别主程序中answer= q.ode_solver(inputs, func6)
的匹配函数调用。但是,如果我用以下代码替换std::function
语句,则效果很好。
template<class char_type, class real_type>
static inline std::tuple<std::vector<real_type>, std::vector<real_type>>
ode_solver(std::map<char_type, real_type> &inputs,
const std::function<double(std::map<char, double>)>& func)
我要做的就是用模板化的参数替换为我想在这种确切情况下使用的参数,但这使使用模板的原因无效。我也尝试过使用answer = q.ode_solver<char, double>(inputs, func6)
调用该函数;并且仍然无法识别该功能。我想念什么?
答案 0 :(得分:4)
在template argument deduction中将不考虑隐式转换(在这种情况下是从函数指针到std::function
的转换。)
类型推导不考虑隐式转换(上面列出的类型调整除外):这是overload resolution的工作,以后会发生。
您可以添加显式转换,例如
answer = q.ode_solver(inputs, static_cast<std::function<double(std::map<char, double>)>>(func6));
或明确指定模板参数(我不确定您为什么说它不起作用,请参见下面的实时演示链接
answer = q.ode_solver<char, double>(inputs, func6);
或者仅添加另一个模板参数,而不使用std::function
。
template<class char_type, class real_type, class F>
static inline std::tuple<std::vector<real_type>, std::vector<real_type>>
ode_solver(std::map<char_type, real_type> &inputs,
const F& func)