c++ - 哪种方法更适合为函数提供编译时间常量?函数参数与模板参数

标签 c++ templates comparison function-parameter

我在整个代码中的多个地方都调用了日志记录功能。对于每个日志,我必须提供2 个编译时间常量。有两种方法可以实现:

(1) 函数参数:

template<typename T>
void log (const T &obj, const int LINE, const int COUNT)
{
  // T is used for some purpose
  if(debug)
    logging(obj.out(), LINE, COUNT);
}

称它为,

log(str, __LINE__, __COUNTER__);

(2)模板参数:

template<typename T, int LINE, int COUNT>
void log (T &obj)
{
  // T is used for some purpose
  if(debug)
    logging(obj.out(), LINE, COUNT);
}

称它为,

log<__LINE__, __COUNTER__>(str);

我无法决定,因为第一种方法提供了简单性,但我们在编译时传递常量。第二种方法是完美的,但编译时间可能会增加。这个任务很繁琐,我还没有实现任何一个,所以我没有任何基准。

如果有人能根据他们的经验/知识回答这个问题,那将是一个很大的帮助。

最佳答案

由于这两者之间的选择会对调用代码产生影响,因此我建议通过宏进行日志记录。那么您现在不必担心哪一个更好,因为在它们之间切换很容易。

一旦您编写了真正的应用程序,您就可以乱用宏定义来比较两者。或者不,如果有更多的生产领域需要优化。如果事实证明有很大的不同,您甚至可以让它对构建配置开放,以决定是使用 -DLOGGING_COMPILES_QUICKLY 还是 -DLOGGING_RUNS_QUICKLY

宏的另一个潜在好处:当且仅当 debug 为真时,您可以安排第一个参数被评估。我不知道 str 的接口(interface)是什么,或者那些对象来自哪里,但是如果产生正确的值传递给 log 需要付出任何代价,然后log 在非调试情况下不使用它,这可能会浪费运行时间。

关于c++ - 哪种方法更适合为函数提供编译时间常量?函数参数与模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8558029/

相关文章:

c++ - 我们需要 std::as_const() 做什么?

performance - 哪种素数生成算法最快?

c++ - 从非模板化接口(interface)检索 'generic'数据

c# - 检查整数是否为 0 并返回 bool 值的简短方法

sql - 将字符串与 SQLite3 中的数字进行比较

c++ - 使用私有(private)析构函数删除动态分配的对象

c++ - 如何声明指向多维数组的指针数组

c++ - 仅使用标准库实现等待计时器

c++ - 带有 packaged_task 的模板无法编译

c++ - 如何从模板中获取容器的类型(例如 int、double 等)? C++