【发布时间】:2014-08-04 22:32:17
【问题描述】:
我有一个看起来像这样的基本类:
template <typename TCode, TCode SuccessVal>
class Error
{
public:
typedef TCode code_t;
Error(TCode code, char const *descr="Unknown Error."):
code(code), descr(descr)
{
}
...
char const *description() const
{
return descr;
}
...
private:
TCode code;
char const *descr;
};
它所做的只是封装某种错误代码枚举类,以便为日志记录提供更多上下文。
现在说我有一个函数panic:
template <typename TCode, TCode SuccessVal>
void panic(Error<TCode, SuccessVal> const &e)
{
puts("Panic!");
printf("Unrecoverable error: %s", e.description());
abort();
}
使用 -fdump-tree-original 编译表明,在我的情况下,这会产生几个不同的函数,但代码完全相同。这是您所期望的,但可能不是您所希望的。
一个明显的路线是一个只包含消息的基类和一个接收消息的构造函数,但我觉得这很不吸引人。
我们从不使用错误代码本身,所以我们所做的一切都依赖于 T。如何避免大量编译为基本相同代码的模板实例化?
另一个理想的特性是确保无论 TCode 是什么类型,它都可以强制转换为整数类型。
【问题讨论】:
-
在 Visual Studio 和其他工具链中,链接器会检测到这些并合并它们。
-
@MooingDuck:说得好!