C++ 类成员,这些成员可以根据模板参数选择是静态的

C++ 类成员,这些成员可以根据模板参数选择是静态的,c++,templates,C++,Templates,设想两个类,StaticFoo和NonStaticFoo,它们相同,只是类成员在StaticFoo中是静态的,但在NonStaticFoo中不是静态的 简单的例子: class StaticFoo { static void bar(); static int v; }; class NonStaticFoo { void bar(); int v; }; 是否可以排除模板类Foo以避免代码重复? 这样一来,人们就可以使用 using StaticFoo = Foo<t

设想两个类,
StaticFoo
NonStaticFoo
,它们相同,只是类成员在
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>;
使用StaticFoo=Foo;
使用非静态Foo=Foo;
是否有可能排除模板类Foo以避免代码重复

“没有”

不幸的是,
static
没有像
noexcept
is这样的表达式来参数化,所以不能像
static(false)
这样说

在不使用宏的情况下,您将被迫专门化模板,这样您就可以在专门化中拥有
static
成员:

template<bool = false>
class Foo{
   void bar();
   int v;
};
template<>
class Foo<true>{
   static void bar();
   static int v;
};
模板
福班{
空心钢筋();
INTV;
};
模板
福班{
静态空心杆();
静态int-v;
};

“静态类”在C++中不是很好的实践。使用名称空间。为什么要这样做?你想解决的实际问题是什么?请花些时间阅读并思考您的问题是如何适合它的。@某个程序员,您可以将其视为给定类型的
模板
注册器类,该类当前在我的代码库中到处都是静态使用的,但我希望慢慢转换为非静态类。我不明白这有什么意义,静态和非静态的东西是根本不同的,它不是一个增量的差异。请看我所说的,提供一个示例用例。例如,全局计数器和局部计数器示例在语义上有很大的差异,您需要重写一些内容。