Không có chuyên ngành một phần của chức năng mẫu, và một phần chuyên biệt hoá một thành viên bạn cần phải đầu tiên một phần chuyên các lớp mẫu.
template< typename _T, size_t num >
struct Foo {
void Func() {
printf("Hello world!");
}
};
template< typename _T >
struct Foo< _T, 1 > {
void Func() {
printf("Hi!");
}
};
Bây giờ, nếu Foo
cũng chứa các phương pháp khác hơn Func
mà thực hiện không phụ thuộc vào giá trị cho num
, và bạn không muốn lặp lại thực hiện của họ trong chuyên môn của Foo
, bạn có thể áp dụng mô hình sau:
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() {
...
}
};
Hoặc, sử dụng CRTP:
template< typename _Derived, typename _T, size_t num >
struct FooFuncBase {
void Func() {
static_cast< _Derived* >(this)->OtherFuncWhoseImplementationDoesNotDependOnNum();
printf("Hello world!");
}
};
template< typename _Derived, typename _T >
struct FooFuncBase< _Derived, _T, 1 > {
void Func() {
static_cast< _Derived* >(this)->OtherFuncWhoseImplementationDoesNotDependOnNum();
printf("Hi!");
}
};
template< typename _T, size_t num >
struct Foo : public FooFuncBase< Foo< _T, num >, _T, num > {
void OtherFuncWhoseImplementationDoesNotDependOnNum() {
printf("Other");
}
};
Tôi thích giải pháp này. Tôi thậm chí đã học được điều gì đó về quy ước đặt tên C++! Tuy nhiên, làm thế nào để làm điều này nếu tôi có, nói rằng, bất kỳ số lượng chuyên môn cho các giá trị khác nhau của num cùng với một fall-back trong trường hợp không ai trong số họ làm việc? –
@wowus, câu trả lời cập nhật –
Cảm ơn, đã chấp nhận. –