使用部分特化和继承:
// Factor common code in a base class
template <size_t n, size_t m>
class MyClassTBase
{
// Put here the methods which must appear
// in MyClassT independantly of n, m
};
// General case: no extra methods
template <size_t n, size_t m>
class MyClassT : MyClassTBase<n, m>
{};
// Special case: one extra method (you can add more here)
template <size_t n>
class MyClassT<n, n> : MyClassTBase<n, n>
{
static MyClassT<n, n> SomeFunc()
{
...
}
};
另一种选择是使用 SFINAE:std::enable_if
或其变体:
template <size_t n, size_t m>
class MyClassT
{
template <typename EnableIf = char>
static MyClassT<n, m> SomeFunc(EnableIf (*)[n == m] = 0)
{
...
}
};
更详细的替代方案(但如果您不了解 SFINAE 和指向数组的指针,就不那么令人惊讶)
template <size_t n, size_t m>
class MyClassT
{
template <typename Dummy = char>
static MyClassT<n, m>
SomeFunc(typename std::enable_if<n == m, Dummy>::type * = 0)
{
...
}
};
一般来说,我更喜欢 SFINAE 方法,其中需要启用或禁用一两个成员函数。一旦它变得比这更复杂,我更喜欢部分专业化技术。
EDIT:SFINAE 代码是错误的,因为没有模板函数。已更正。