使用带数字的模板函数

时间:2013-04-20 13:55:25

标签: c++

我创建了模板函数,允许我用任何类型的数字,int,double等来调用它......

要调用此函数,我需要知道一个数字,为​​了得到这个数字,我从控制台(std::cin)读取它。

我想知道 - 使用模板的目的是什么,如果我必须声明变量类型以将它传递给函数呢?我的意思是,我不会问用户他想要传递的是什么类型的号码,而且我肯定不会为所有数据类型执行切换循环来以不同的方式调用函数。

如果有什么不够清楚的话,让我提供一些简单的例子:

template <typename T>
T sum(T a, T b)
{
   return a + b;
}

int main()
{
   using namespace std;
   int a, b; // here, this line

   cout << "Provide first number: ";
   cin >> a;
   cout << "Provide second number: ";
   cin >> b;
   sum(a, b);
}

我一直在考虑创建另一个模板函数,例如loadVariable(),返回加载的变量,如:

template <typename T>
T loadVariable(string text)
{
   T var = new T;
   cout << text;
   cin >> var;
   return var;
}

然后做这样的事情:

int main()
{
   using namespace std;
   sum(loadVariable("Provide first number: "), loadVariable("Provide second number: ");
}

然而,它看起来很丑陋。

这是使用这种功能的好习惯吗?

或许还有其他一些我不知道的很酷的方式?

4 个答案:

答案 0 :(得分:3)

模板有助于避免从开发和维护角度出现代码重复(Do not repeat yourself)(尽管编译器将为每个专业化生成代码)。它们还用于使用template metaprogramming执行各种编译时任务与运行时任务。

由于C ++是静态类型的,因此必须在编译时知道类型,因此必须声明它。有关可以包含多种类型之一的类,请参阅boost :: variant。

我认为你在这里使用模板的问题更多的是静态类型与动态类型语言的问题。我没有检查它,但我认为loadVariable()概念不会编译,因为未指定模板参数,编译器无法从调用本身派生特化。您必须在loadVariable<int>()loadVariable<double>()指定模板参数。

问题是你需要区分整数或浮点类型。因为您可以将输入变量声明为double,它可以包含。

这可能只是用于帖子的示例代码,但这个函数是内存泄漏吗?

template <typename T>
T loadVariable(string text)
{
   T var = new T;
   cout << text;
   cin >> var;
   return var;
}

答案 1 :(得分:1)

使用模板的关键在于代码中的其他位置您可能希望sum使用两个不同的类型变量。当然,如果您知道您的代码非常简单,以至于您只能使用sum类型调用int,那么您可以使用define sum来{{1}而不是模板。

你的int的第二个例子不会像你描述的那样工作,因为你需要指定模板参数:

loadVariable

你当然可以这样写:

sum(loadVariable<float>("Provide first number: "), loadVariable<float>("Provide second number: "));

必须在编译时知道模板参数。模板是一个编译时构造。您始终可以在代码中的某个位置知道要传递给函数的参数类型。模板函数的要点不是接受其类型可能以某种方式变化的变量。类型无法变化。它们也是编译时构造。模板函数的要点是为不同类型提供函数的泛型实现,以便可以在整个程序的各个地方调用它。

答案 2 :(得分:0)

如果要创建一个函数来对两个32位整数求和,则无需使用模板。当您需要在许多不同类型中执行相同的操作时,可以使用模板。例如,假设您要实现一个返回两个元素中最小的函数。让我们称之为min。在您的程序中,您可能会多次调用min函数,每次都有不同类型的参数。如果您不使用模板,您的代码将如下所示:

int min( int a, int b ) { ... }
long min( long a, long b ) { ... }
long long min( long long a, long long b ) { ... }
...
...
...

这样做不容易:

template< typename T >
T min( T a, T b ) { return a < b; }

在您的情况下,您只需要求和整数,就不需要使用模板,因为函数的参数将始终为int

总而言之,模板为您提供编译时灵活性(@Stephane Rolland),这意味着它们在运行时几乎无用。

答案 3 :(得分:0)

我无法回答所有模板的使用,但举个例子:
当我们用数组形式参数编写一个函数,如:

void foo( int arr[] );

如果,数组绑定的精确值很重要,您可以这样做:

void foo(int (&arr)[12] );

foo()只接受大小为12的数组! 模板很有用:

template <int n>   
void average( int (&ary)[n] ); // let compiler deduce n for us

更传统的解决方案是

void average_n( int ary[], int size );

当然,我们可以将两种方法结合起来:

template <int n>
inline void average( int (&ary)[n] )
    { average_n( ary, n ); }

参考:C ++常识:基本中间编程,第6项。数组正式参数