我希望有一个类似于下面的模板类。然后,我想要一个带有模板特化的函数,具体取决于CLASS模板参数。我该如何工作?我意识到我提供的代码在很多层面都是错误的,但它只是为了说明这个概念。
template <typename _T, size_t num>
class Foo
{
// If num == 1, I want to call this function...
void Func<_T, 1>()
{
printf("Hi!");
}
// Otherwise, I want to call this version.
void Func<_T, num>()
{
printf("Hello world!");
}
};
答案 0 :(得分:9)
struct Otherwise { };
template<size_t> struct C : Otherwise { };
// don't use _Uppercase - those names are reserved for the implementation
// (i removed the '_' char)
template <typename T, size_t num>
class Foo
{
public:
void Func() { Func(C<num>()); }
private:
// If num == 1, I want to call this function...
void Func(C<1>)
{
printf("Hi 1!");
}
// If num == 2, I want to call this function...
void Func(C<2>)
{
printf("Hi 2!");
}
// Otherwise, I want to call this version.
void Func(Otherwise)
{
printf("Hello world!");
}
//// alternative otherwise solution:
// template<size_t I>
// void Func(C<I>) { .. }
};
答案 1 :(得分:2)
没有功能的部分特化 模板,并部分专门化您需要的成员 部分专门化类模板。
template< typename _T, size_t num >
struct Foo {
void Func() {
printf("Hello world!");
}
};
template< typename _T >
struct Foo< _T, 1 > {
void Func() {
printf("Hi!");
}
};
现在,如果Foo
还包含Func
以外的方法,其实现与num
的值无关,并且您不希望在{的特化中复制它们的实现{1}},您可以应用以下模式:
Foo
或者,使用CRTP:
template< typename _T, size_t num >
struct FooFuncBase {
void Func() {
printf("Hello world!");
}
};
template< typename _T >
struct FooFuncBase< _T, 1 > {
void Func() {
printf("Hi!");
}
};
template< typename _T, size_t num >
struct Foo : public FooFuncBase< _T, num > {
void OtherFuncWhoseImplementationDoesNotDependOnNum() {
...
}
};
答案 2 :(得分:1)
这称为部分模板特化。它看起来像这样:
template<typename _T, size_t num>
class FooBase
{
};
template <typename _T, size_t num>
class Foo : public FooBase<_T,num>
{
void Func()
{
printf("Hello world!");
}
};
template <typename _T>
class Foo<_T,1> : public FooBase<_T,num>
{
void Func()
{
printf("Hi!");
}
}