[英]C++ templates: Query regarding which is better of way of using and why
我有一个问题。 这样做更好。
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 )
{
}
基本上我在寻找的是,这两种方法有何不同? 如果我必须使用其中任何一个我应该选择哪个以及为什么?
这真的取决于你想做什么。 如果num
值是模板参数,则必须在编译时指定它。 如果它是一个函数参数,那么可以在运行时指定它。
你的用例是什么?
这是您希望了解的代码清洁度问题。 假设用户输入选项。 所以你有一些变量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
。 然而,前两个模板化方法将能够删除这些分支。 它可以这样做,因为它将在内存中构建两个不同的代码路径,每种情况一个。
我会去第二,除非foo()
对性能至关重要,因为我觉得它更清晰。
至于差异:
第一个将编译为不同的版本,用于不同的Number
值。 这可能允许编译器根据num
的使用方式进行更多优化。
第二个将只有不同的T
版本,并将在运行时选择不同的num
。
第一个可能稍微快一点,但第二个会产生更少的代码(根据内存压力可能会更快)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.