【问题标题】:Class members that are optionally static depending on template parameters根据模板参数可选静态的类成员
【发布时间】:2017-07-10 19:44:27
【问题描述】:

想象两个类,StaticFooNonStaticFoo,它们相同,除了类成员在 StaticFoo 中是静态的,但在 NonStaticFoo 中不是。
简单例子:

class StaticFoo {
  static void bar();
  static int v;
};

class NonStaticFoo {
  void bar();
  int v;
};

是否可以分解出模板类Foo 以避免代码重复?
这样人们就可以使用类似的东西

using StaticFoo = Foo<true>;
using NonStaticFoo = Foo<false>;

【问题讨论】:

  • “静态类”在 C++ 中不是很好的做法。使用命名空间。
  • 为什么要这样做?您要解决的实际问题是什么?请花一些时间阅读 the XY problem 并思考您的问题是否适合它。
  • @Someprogrammerdude 您可以将其视为给定类型的 template&lt;typename T&gt; Registrator 类,该类目前在我的代码库中的任何地方都静态使用,但我想慢慢地转换为非静态类.
  • 我不明白这有什么意义,静态和非静态的东西根本不同,它不是增量差异
  • 暂别我所说的,提供一个示例用例。例如,全局计数器和本地计数器示例在语义上有很大差异,您需要重写很多东西。

标签: c++ templates


【解决方案1】:

是否可以分解出模板类 Foo 以避免代码重复?

“没有”

不幸的是,static 没有被 noexcept 这样的表达式参数化,所以你不能说像 static(false) 这样的东西。

在不使用宏的情况下,您必须专门化一个模板,以便您可以在专门化中拥有static 成员:

template<bool = false>
class Foo{
   void bar();
   int v;
};
template<>
class Foo<true>{
   static void bar();
   static int v;
};

【讨论】:

    猜你喜欢
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多