根据类型调用不同的函数

时间:2014-11-19 04:11:11

标签: c++ templates

我想沿着这些方向做点什么

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,因为我记得在某个地方读过这个调用会导致性能下降)?

3 个答案:

答案 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);

}