【发布时间】:2014-02-16 00:08:27
【问题描述】:
如果函数的参数将在编译时已知,那么将其转为模板参数是否正确?
以如下代码为例:
template<typename ... P> void
LOG
( const severity_level & l , const P & ... p )
{
// Take the parameters from 'p' and use it to construct a message.
// Then, prepend a string depending on the severity level specified.
}
由于严重性级别始终是编译时常量,我可以这样做:
template<severity_level L , typename ... P> void
LOG
( const P & ... p )
{
// Call me like this: LOG<debug>("this is a debugging message")
}
只需对源代码稍加修改,就可以去掉一个参数。这个解决方案有什么缺点吗,还是没问题?
最好的问候, 卡尔里什
P.S.:这样做的另一个好处是更容易在编译时过滤,在此示例中,记录调用。
【问题讨论】:
-
您自己提到了缺点:1)必须在编译时知道,2)不再有“一个记录功能”。请注意,调用站点当然会在编译时知道严重性级别,但模板版本禁止在日志管道中编写通用代码anywhere。
-
@DanielFrey 你是对的,对不起。已更正。
-
@a.lasram 是一个示例枚举。关于参考,我不明白你的意思。 FWIW,我刚刚修正了一个错误(将
typename L更改为severity_level L)。 -
嗯,这取决于用例:/ ...对于您给出的示例,恕我直言,这是一个坏主意(看看@TimothyShields 的答案)。
标签: c++ templates c++11 parameters parameter-passing