C ++模板:查询哪个更好的使用方式和原因

时间:2010-10-07 15:14:22

标签: c++ templates

我有一个问题。这样做更好。

typedef enum{
  One = 1,
  Two = 2
} Number;

template< typename T, Number num >
void foo( const T& param )
{
}

or 

template< typename T >
void foo( const T& param, Number num )
{
}

基本上我在寻找的是,这两种方法有何不同?如果我必须使用其中任何一个我应该选择哪个以及为什么?

3 个答案:

答案 0 :(得分:10)

这实际上取决于你想做什么。如果num值是模板参数,则必须在编译时指定它。如果它是一个函数参数,则可以在运行时指定它。

你的用例是什么?

答案 1 :(得分:4)

这是您需要了解的代码清洁度问题。假设用户输入选项。因此,您有一些变量Number x,可能是OneTwo。如果您想致电foo(),则需要执行...

if (x == One)
    foo<const char *, One>("asd");
else
    foo<const char *, Two>("asd");

如果您使用替代方式(您的建议编号为2),您只需执行以下操作:

foo<const char *>("asd", x);

现在,如果在这个函数中,将那些可能的分支优化出来是非常有益的,那么肯定。但除此之外,我认为你只是让自己生活困难。


此外,关于这些方法如何不同。在我上面编写的代码中,我引用了三个不同的函数。在最后一个模板参数中,只有一个模板参数,为该函数生成的代码将包括num == Onenum == Two时的两个代码路径。然而,前两个模板化方法将能够删除这些分支。它可以做到这一点,因为它将在内存中构建两个不同的代码路径,每种情况一个。

答案 2 :(得分:2)

除非foo()对性能至关重要,否则我会选择第二,因为我觉得它更清晰。

至于差异:

第一个将编译为不同Number值的不同版本。这可能允许编译器根据num的使用方式进行更多优化。

第二个版本只针对不同的T使用不同的版本,并会在运行时选择不同的num

第一个可能稍快一点,但第二个会产生更少的代码(根据内存压力可能会更快)。