繁体   English   中英

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

[英]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 ,可能是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 然而,前两个模板化方法将能够删除这些分支。 它可以这样做,因为它将在内存中构建两个不同的代码路径,每种情况一个。

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

至于差异:

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

第二个将只有不同的T版本,并将在运行时选择不同的num

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM