如何将重载函数作为模板化函数参数传递
How do I pass an overloaded function as a templated function parameter?
所以我要做的是写一个泛型函数,它接受一个字符串,将它分割成一个类型的向量。这是我的代码,问题是它无法将stod函数类型解析为我指定的通用函数包装器。
#include <string>
#include <sstream>
#include <vector>
#include <iostream>
#include <functional>
using std::vector;
using std::string;
using std::function;
using std::stringstream;
int main(int argc, const char * argv[]) {
SplitStringToTypedVector("1.23 3.45 5.21", ' ', static_cast<double (*)(const string&, size_t*)>(&std::stod));
system("pause");
return 0;
}
template <typename T>
vector<T> SplitStringToTypedVector(const string &s, char delim, function<T (*)(const string&, size_t*)> conversionFunc) {
vector<T> elements;
stringstream stream;
string element;
while (getline(stream, element, delim)) {
elements.push_back(conversionFunc(element));
}
return elements;
}
只是关于你的代码的几点。
(1)在main()
中称为SplitStringToTypedVector()
,在它的定义之前。这是不好的。您应该与main()
和SplitStringToTypedVector()
交换,或者在main()
之前添加SplitStringToTypedVector()
的原型
(2)使用std::function
必须避免(*)
;所以
function<T(const string&, size_t*)> conversionFunc
代替
function<T(*)(const string&, size_t*)> conversionFunc
(3)你的函数conversionFunc()
被声明接收2个参数。我知道std::tod
的第二个参数有默认值,但我不认为SplitStringToTypedVector()
能够知道它。所以用参数
conversionFunc()
是错误的elements.push_back(conversionFunc(element));
必须用两个
来调用elements.push_back(conversionFunc(element));
(4)我不知道如何强制识别类型T
调用SplitStringToTypedVector()
(我的极限,我想);但是你可以显式的
SplitStringToTypedVector<double>("1.23 3.45 5.21", ' ', static_cast<double (*)(const string&, size_t*)>(&std::stod));
可能使用lambda来解析函数类型更干净,而不是担心消除stod
的重载歧义:
#include <string>
#include <sstream>
#include <vector>
#include <iostream>
#include <functional>
using std::vector;
using std::string;
using std::function;
using std::stringstream;
template <class Func>
auto SplitStringToTypedVector(const string &s,
char delim,
Func&& conversionFunc) {
using result_type = decltype(conversionFunc(s));
vector<result_type> elements;
stringstream stream;
string element;
while (getline(stream, element, delim)) {
elements.push_back(conversionFunc(element));
}
return elements;
}
int main(int argc, const char * argv[]) {
SplitStringToTypedVector("1.23 3.45 5.21",
' ',
[](std::string const& s) { return std::stod(s); });
system("pause");
return 0;
}
相关文章:
- 如何在C++中将迭代器作为函数参数传递
- 为什么我不能将引用作为 std::async 的函数参数传递
- 节点插件 API 将数组作为函数参数传递
- 将字符串数组作为函数参数传递
- 如何通过 C++ 中的函数参数传递初始值设定项列表的固定大小的初始值设定项列表?
- 我可以动态创建新地图并作为函数参数传递吗?
- 将任意模板向量作为函数参数C++传递
- 将函数指针作为函数参数传递的目的
- C++:通过函数参数传递的值给出不同的结果
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 通过宏将函数参数传递给函数
- C++:访问作为函数参数传递的双指针数组所指向的变量的值
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 将派生类构造函数参数传递给受保护的成员
- 将指向数组的指针作为函数参数传递,这本身就是另一个函数的返回值?
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 如何将变量作为构造函数参数或函数参数传递
- 当数组对象以函数参数传递时,为什么复制构造函数会自称