class 中一种方法的部分专业化
Partial specialization for one method in the class
我有一个模板矩阵class。我尝试将大小(始终为正方形)实现为模板参数。
template<
// Type of data
typename type_t,
// dimension of the matrix 4 -> 4x4
std::size_t dim_t,
// I don't want a matrix of non numeric value
typename = typename std::enable_if_t< std::is_arithmetic_v< type_t >, type_t >
>
class Matrix final
{
// ....
}
通过这段代码,我希望能够针对不同大小的矩阵制定不同的方法。因为某些方法迫使我在不进入暗代码的情况下考虑它...
// For instance
void doSomething (void);
有没有像下面这样的方法可以使用?因为我看到了很多例子,而且我总是出错。我使用 C++17 和 GCC。最后的想法是只有一个头文件。
template<
typename type_t,
std::size_t dim_t,
typename = typename std::enable_if_t< std::is_arithmetic_v< type_t >, type_t >
>
class Matrix final
{
// ...
// Specialization for matrix 4x4
template < typename type_t >
void doSomething< type_t, 4 > (void)
{
// Specific code for matrix 4x4.
}
// ...
}
您可能会使用 SFINAE:
template<
typename type_t,
std::size_t dim_t,
typename = typename std::enable_if_t< std::is_arithmetic_v< type_t >, type_t >
>
class Matrix final
{
// ...
// Specialization for matrix 4x4
template <std::size_t N = dim_t, std::enable_if_t<N == 4, int> = 0>
void doSomething()
{
// Specific code for matrix 4x4.
}
// ...
};
C++20 允许 requires
以获得更好的语法:
template<
typename type_t,
std::size_t dim_t,
typename = typename std::enable_if_t< std::is_arithmetic_v< type_t >, type_t >
>
class Matrix final
{
// ...
// Specialization for matrix 4x4
void doSomething() requires(dim_t == 4)
{
// Specific code for matrix 4x4.
}
// ...
};
我有一个模板矩阵class。我尝试将大小(始终为正方形)实现为模板参数。
template<
// Type of data
typename type_t,
// dimension of the matrix 4 -> 4x4
std::size_t dim_t,
// I don't want a matrix of non numeric value
typename = typename std::enable_if_t< std::is_arithmetic_v< type_t >, type_t >
>
class Matrix final
{
// ....
}
通过这段代码,我希望能够针对不同大小的矩阵制定不同的方法。因为某些方法迫使我在不进入暗代码的情况下考虑它...
// For instance
void doSomething (void);
有没有像下面这样的方法可以使用?因为我看到了很多例子,而且我总是出错。我使用 C++17 和 GCC。最后的想法是只有一个头文件。
template<
typename type_t,
std::size_t dim_t,
typename = typename std::enable_if_t< std::is_arithmetic_v< type_t >, type_t >
>
class Matrix final
{
// ...
// Specialization for matrix 4x4
template < typename type_t >
void doSomething< type_t, 4 > (void)
{
// Specific code for matrix 4x4.
}
// ...
}
您可能会使用 SFINAE:
template<
typename type_t,
std::size_t dim_t,
typename = typename std::enable_if_t< std::is_arithmetic_v< type_t >, type_t >
>
class Matrix final
{
// ...
// Specialization for matrix 4x4
template <std::size_t N = dim_t, std::enable_if_t<N == 4, int> = 0>
void doSomething()
{
// Specific code for matrix 4x4.
}
// ...
};
C++20 允许 requires
以获得更好的语法:
template<
typename type_t,
std::size_t dim_t,
typename = typename std::enable_if_t< std::is_arithmetic_v< type_t >, type_t >
>
class Matrix final
{
// ...
// Specialization for matrix 4x4
void doSomething() requires(dim_t == 4)
{
// Specific code for matrix 4x4.
}
// ...
};