【问题标题】:C++ template with no template parameters?没有模板参数的 C++ 模板?
【发布时间】:2015-10-29 15:21:52
【问题描述】:

我讨厌 C++ 中传统类声明中固有的样板和 Don't Repeat Yourself 违规行为。

是否可以创建一个没有模板参数的模板,纯粹是为了在头文件中定义类而不违反 C++11 中的单一定义规则?

【问题讨论】:

  • 重点是什么?如果您想要的是完全在标头中声明和实现一个类,您可以在不作为模板的情况下执行此操作。但是请注意,包含该标头的每个模块都将获得该实现的副本,并且您可能会收到“重复符号”链接器错误。
  • 我认为单一定义规则并不像您想象的那么严格。
  • inline真的这么累吗?
  • 查看this question 接受的答案。我在任何地方见过的最好的解释。

标签: c++ class templates c++11


【解决方案1】:

不需要任何模板。

如果你想写一个只有头的类,你所要做的就是标记inline将在类声明外部定义的函数:

#pragma once

struct some_class {
    void implicitly_inline() { ... }

    inline void explicitly_inline();
};

void some_class::explicitly_inline() { ... }

偶尔额外的inline 关键字几乎不会像改变你的类的整个定义这样的负担。

【讨论】:

    【解决方案2】:

    是否可以创建没有模板参数的模板

    没有。而且您不需要这种解决方法,因为...

    允许在头文件中定义类而不违反单一定义规则

    你可以在头文件中定义一个类而不违反一个定义规则。

    您甚至可以在标题中定义类的成员函数——我认为这是这个问题的重点。只需将它们全部声明为inline。如果您在类定义中定义成员函数,那么它们是隐式内联的。

    程序中的内联函数可能有多个定义,只要每个定义出现在不同的翻译单元中。例如,可以在多个源文件中#include 的头文件中定义内联函数。

    【讨论】:

    • 好的,所以如果我理解正确的话,每次我#include它都重新编译我的类,但是链接器会合并冗余实例?我应该祈祷我的构建配置正确,这样旧的 .o 文件就不会留下来......
    • @AndrewWagner 如果编译器有这样的优化,它可能会跳过重新编译,但原则上是可以的。内联模板有相似之处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多