将“正常”参数转换为模板化参数是否正确?

时间:2014-01-24 20:43:22

标签: c++ templates c++11 parameters parameter-passing

如果在编译时知道函数的参数是否正确将其转换为模板参数?

以下面的代码为例:

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")
    }

对源代码的修改很少,我可以摆脱一个参数。这个解决方案有什么缺点,还是很好?

祝你好运, Kalrish

P.S。:另一个好处是,在本例中,更简单的编译时过滤记录调用。

2 个答案:

答案 0 :(得分:1)

我可以想象有人想要编写如下代码。

severity_level level = none;
if (discrepancy > .05)
{
    level = fatal;
}
else if (discrepancy > .01)
{
    level = warning;
}

if (level != none)
{
    //Taking some liberty with the printf-like signature...
    LOG(level, "Discrepancy in thingamabob: %f", discrepancy);
}

因此使用模板化方法是一个坏主意。

答案 1 :(得分:1)

除了限制编译时值之外,非类型模板参数仅限于某些类型:Integral,enum,pointer,lvalue reference,指向成员的指针或std::nullptr_t类型。因此,如果参数不是其中之一,则无法将其转换为模板参数。当然,严重程度可能是枚举,所以这可能很好。

要记住的一件事是,即使您的代码现在符合要求,将来您可能希望进行更改,如果您以这种方式限制自己,可能会更难。例如,您最终可能希望根据用户选项在不同的严重性级别创建一些消息日志。

除非你能确定一个具体的好处,否则你应该避免做出改变。