bool 上的模板偏特化
Template partial specialization on bool
我认为这是一个非常基本的问题,但我无法找到答案,即使在 Whosebug 上也是如此。很抱歉,如果你在阅读本文时想打我。
我只想对布尔值进行部分特化:
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 {
您的模板定义了一个 class,而不是一个函数。这意味着您必须专门化 class,而不是 class 方法:
template < typename Object >
class Foo<Object, false> {
void bar();
};
template < typename Object >
class Foo<Object, true> {
void bar();
};
另一种方法是分解 foo 并在单独的助手中处理 bar 的实现 class。这减少了实现 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;
}
我认为这是一个非常基本的问题,但我无法找到答案,即使在 Whosebug 上也是如此。很抱歉,如果你在阅读本文时想打我。
我只想对布尔值进行部分特化:
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 {
您的模板定义了一个 class,而不是一个函数。这意味着您必须专门化 class,而不是 class 方法:
template < typename Object >
class Foo<Object, false> {
void bar();
};
template < typename Object >
class Foo<Object, true> {
void bar();
};
另一种方法是分解 foo 并在单独的助手中处理 bar 的实现 class。这减少了实现 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;
}