我想沿着这些方向做点什么
template<typename T>
bool FetchVal(T & fetchedData)
{
//Get data from some function
dataAsString = Get();
// based on type of T call
fetchedData = ConvertToDouble(dataAsString);
//or
fetchedData = ConvertToInt(dataAsString);
//and so on
}
这是否可以使用模板,如果是,如何?
编辑:基本上我正在解析XML,在get for a tag中,现在需要将该字符串转换为int / double / ...基于预期的类型(即fetchedData的类型)希望这能说清楚。
大卫给出了答案,确实应该有效。有没有更优雅的方式(如果可能的话,不使用typeid,因为我记得在某个地方读过这个调用会导致性能下降)?答案 0 :(得分:2)
template<typename T>
bool FetchVal(T & fetchedData)
{
//Get data from some function
dataAsString = Get();
stringstream ss(dataAsString);
ss >> fetchdData;
}
答案 1 :(得分:1)
执行所需操作的简单方法是使用输出参数:
template<typename T>
bool FetchVal(T & fetchedData)
{
// Get data from some function
dataAsString = Get();
Convert(dataAsString, fetchedData);
}
然后,根据需要拥有尽可能多的Convert实现。
答案 2 :(得分:1)
您可以将模板用作:
#include <iostream>
using namespace std;
class X{
public:
void fnX(const string& data){cout<<" in X "<<data<<endl;}
};
class Y{
public:
void fnY(const string& data){cout<<" in Y "<<data<<endl;}
};
typedef void (X::*FnXType)(const string&);
typedef void (Y::*FnYType)(const string&);
template<typename T, typename Fnc>
bool FetchVal(T & fetchedData, Fnc fnc)
{
//Get data from some function
//dataAsString = Get();
string dataAsString("data");
(fetchedData.*fnc)(dataAsString);
}
int main()
{
X objX;
FnXType fncX = &X::fnX;
FetchVal<X, FnXType>(objX, fncX);
Y objY;
FnYType fncY = &Y::fnY;
FetchVal<Y, FnYType>(objY, fncY);
}