使用功能模板

时间:2010-01-22 19:56:34

标签: c++ templates

我创建了一个不同数据类型的结构,我想返回每种类型的数据。这是否可以使用函数模板来完成,该函数模板采用不包含在结构中的不同数据参数或没有参数?

我有类似的东西,

struct mystruct{
int _int;
char _c;
string _str
};

In function template(int i)
{
     mystruct s;

      switch (getInput)
     {
      case 1:
        return s._int;
      case 2:
        return s._c;
      case 3:
        return s._str;
   }   
} 

void main()  

{
   int getInput = 1;
   //pass getInput value to function template
}

4 个答案:

答案 0 :(得分:4)

是:

template<class T>
T f() {
  return 0; // for the sake of example
}

int main() {
  return f<int>(); // specify the template parameter
}

template<class T>
vector<T> another_example();
// use another_example<int>() which returns a vector<int>

答案 1 :(得分:1)

以下是建立GMan(现已删除)对您这个令人困惑的问题的解释:

struct some_data
{
    int i;
    char c;
    std::string s;
};

template< typename T > struct Getter;
template<> struct Getter<int> { static int& get(some_data& data) {return data.i} };
template<> struct Getter<char> { static char& get(some_data& data) {return data.c} };
template<> struct Getter<std::string> { static std::string& get(some_data& data) {return data.s} };

template< typename T >
inline T get(some_data& data) {return Getter<T>::get(data);}

我不确定。不过,这是否是你所要求的。

答案 2 :(得分:1)

我的理解如下:我想创建一个函数,其返回类型取决于其参数。嗯,从技术上讲,你不能。

  1. 当这些返回类型是具有共同祖先的类时,您可以返回指向该祖先的指针。这不是一回事,但它确实有效。不幸的是,其中两种返回类型是charint,它们首先不是类。

  2. 当这些返回类型是普通旧数据类型时,您可以返回标记的联合。不幸的是,其中一种返回类型是std::string,它不是普通的旧数据类型。

  3. 适用于任何类型的解决方案,但令人难以置信的是黑客使用void*。好吧,不幸的是,void*容易出错。如果您使用void*,那么维护您的代码的人将永远诅咒您。

  4. 有效的最终解决方案(双关语)是使用boost::variant。它非常复杂,但至少它是安全的(与void*不同),因为可以在编译时检查类型错误。

答案 3 :(得分:0)

以下是另一种不使用模板的解释:

struct some_data
{
    int i;
    char c;
    std::string s;

    void get(int& value) const
         { value = i; }
    void get(char& value) const
         { value = c; }
    void get(& value) const
         { value = s; }
};

// ...
some_data received_data;
int k;
received_data.get(k);
//...
received_data.s = "Hello";
std::string world;
received_data.get(world);
std::cout << world << std::endl;

编译器将根据参数的类型生成正确的方法调用。 这可以转换为非成员函数:

void Get_Some_Data(char& value, const some_data& sd)
{
    value = sd.c;
    return;
}


void Get_Some_Data(int& value, const some_data& sd)
{
    value = sd.i;
    return;
}

void Get_Some_Data(std::string& value, const some_data& sd)
{
    value = sd.s;
    return;
}

//...
char f;
Get_Some_Data(f, received_data);