模板部分专业化

Template partial specialization on bool

本文关键字:专业化 板部      更新时间:2023-10-16

这是我认为的一个非常基本的问题,但是即使在stackoverflow上,我也找不到答案。很抱歉,如果您想在阅读时打我。

我只想对布尔值进行部分专业化:

template < typename Object, bool Shared = false >
class Foo {
  void bar();
};
template < typename Object >
void  Foo<Object, true>::bar() {}
template < typename Object >
void  Foo<Object, false>::bar() {}
int main() {
  Foo<int> test;
  return 0;
}

我认为这个想法是正确的,但是我缺少此代码(可能真的很愚蠢):

Test3.cpp:8:30: error: invalid use of incomplete type ‘class Foo<Object, true>’
 void  Foo<Object, true>::bar() {
                              ^
Test3.cpp:2:7: note: declaration of ‘class Foo<Object, true>’
 class Foo {
       ^~~
Test3.cpp:13:31: error: invalid use of incomplete type ‘class Foo<Object, false>’
 void  Foo<Object, false>::bar() {
                               ^
Test3.cpp:2:7: note: declaration of ‘class Foo<Object, false>’
 class Foo {

您的模板定义了类,而不是函数。这意味着您必须专注于该类,而不是类方法:

template < typename Object >
class Foo<Object, false> {
  void bar();
};
template < typename Object >
class Foo<Object, true> {
  void bar();
};

另一种方法是分解foo并在单独的助手类中处理bar的实现。这减少了实施Foo所需的重复量。

例如:

template<class Object, bool Shared>
struct implement_bar;
template<class Object>
struct implement_bar<Object, true>
{
  void operator()(Object& o) const 
  {
    // do true thing with o
  }
};
template<class Object>
struct implement_bar<Object, false>
{
  void operator()(Object& o) const 
  {
    // do false thing with o
  }
};
template < typename Object, bool Shared = false >
class Foo {
  void bar()
  {
    return implement_bar<Object, Shared>()(*this);
  }
};
int main() {
  Foo<int> test;
  return 0;
}