使用部分特,和繼承:
// 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和p ointer到陣列)是
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接近其中存在一個或兩個成員函數來啓用或禁用。只要它比這更復雜,我更喜歡部分專業化技術。
編輯:由於沒有模板函數,SFINAE代碼是錯誤的。糾正。