【问题标题】:C<T> derived from T, is it safe?C<T> 从 T 派生,安全吗?
【发布时间】:2017-03-21 03:29:53
【问题描述】:

如果我可以为某个类 C&lt;T&gt; 指定基类 (C derived from T),我有一个问题可以很好地解决。

我以前从未这样做过,所以我创建了一个简短的测试用例和it works

#include <iostream>
using namespace std;

class B{
    public: int k=5;
};
template<class T> class C : public T{};

int main() {
    C<B> c;
    std::cout<<c.k<<std::endl;
    return 0;
}

问题

它是否处于 C++ 语法的边缘? / 是实现定义的吗?
在实际业务中使用是否安全?
有什么我应该特别关注的吗? (我希望没有。)
这种技术叫什么(如果有的话)?

【问题讨论】:

  • @Nicky C 谢谢!哇,它被广泛使用!
  • @NickyC:这是一种模式,其中基类将派生类作为模板参数接收。从模板参数派生并不完全相同。
  • 这看起来与具有class D : public B&lt;D&gt; 模式的 CRTP 相似,但有点不同,因此基类可以使用派生类的功能。
  • @Havenard:C++ 中有很多东西是编译器允许的(甚至可能是合法、有效的代码),这会引起人们的关注。

标签: c++ c++11 templates inheritance


【解决方案1】:

它不是'在 C++ 的边缘',但如果 T 是一种可以派生的类型,那么它是完全合法的。我不知道这个“模式”的具体名称。

请注意,您可以改为从 std::remove_reference_t&lt;T&gt; 派生(以使 C&lt;B&amp;&gt; 等内容有效)或保留 T 以使 C&lt;B&amp;&gt; 等的编译失败 - 它取决于。

【讨论】:

  • 最后一个问题你也可以回答吗? XD
  • @javaLover:它没有名字。 CRTP 与您正在做的事情相反。在 CRTP 中,您的类型 T 派生自 C&lt;T&gt;
  • @NicolBolas 它有一个名字,不就是最简单形式的mixin吗?
  • @skypjack 谢谢。同意(+this drdobbs reference)。如果需要,您可以将其发布为解决方案(针对最后一个未回答的问题)。如果是这样,我会赞成它。 :)
  • @javaLover 我不是在寻找 SO 的声誉,如果 Pixelchemist 将名称添加到其答案中,那将是值得的。尝试ping他。 ;-)
猜你喜欢
  • 2015-07-14
  • 2016-11-05
  • 2010-10-22
  • 2022-08-15
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
相关资源
最近更新 更多