我有一个问题。这样做更好。
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 )
{
}
基本上我在寻找的是,这两种方法有何不同?如果我必须使用其中任何一个我应该选择哪个以及为什么?
答案 0 :(得分:10)
这实际上取决于你想做什么。如果num
值是模板参数,则必须在编译时指定它。如果它是一个函数参数,则可以在运行时指定它。
你的用例是什么?
答案 1 :(得分:4)
这是您需要了解的代码清洁度问题。假设用户输入选项。因此,您有一些变量Number x
,可能是One
或Two
。如果您想致电foo()
,则需要执行...
if (x == One)
foo<const char *, One>("asd");
else
foo<const char *, Two>("asd");
如果您使用替代方式(您的建议编号为2),您只需执行以下操作:
foo<const char *>("asd", x);
现在,如果在这个函数中,将那些可能的分支优化出来是非常有益的,那么肯定。但除此之外,我认为你只是让自己生活困难。
此外,关于这些方法如何不同。在我上面编写的代码中,我引用了三个不同的函数。在最后一个模板参数中,只有一个模板参数,为该函数生成的代码将包括num == One
和num == Two
时的两个代码路径。然而,前两个模板化方法将能够删除这些分支。它可以做到这一点,因为它将在内存中构建两个不同的代码路径,每种情况一个。
答案 2 :(得分:2)
除非foo()
对性能至关重要,否则我会选择第二,因为我觉得它更清晰。
至于差异:
第一个将编译为不同Number
值的不同版本。这可能允许编译器根据num
的使用方式进行更多优化。
第二个版本只针对不同的T
使用不同的版本,并会在运行时选择不同的num
。
第一个可能稍快一点,但第二个会产生更少的代码(根据内存压力可能会更快)。