C++ 具有 2 个模板参数的类,具有 1 个参数的函数

C++ Class with 2 template arguments, function with 1 argument

本文关键字:参数 具有 函数 C++      更新时间:2023-10-16

有没有办法调用只接受 1 个模板参数而不是 2 个模板参数的类成员函数?

我想写一些这样的代码:

template<typename T, size_t N>
void Container<int, N>::quick_sort() {
}

你不能部分专用化一种方法,你可以部分专用化整个类,但需要一些重复。

template<typename T, size_t N>
class Container
{
// Some code ...
void quick_sort();
};
template <typename T,size_t N>
void Container<T, N>::quick_sort()
{
// ...
}
// Class specialization
template <size_t N>
class Container<int, N>
{
// Some similar/same code...
void quick_sort();
};
template <size_t N>
void Container<int, N>::quick_sort()
{
// ...
}

作为替代方案,C++17 允许

template<typename T, size_t N>
class Container
{
// Some code ...
void quick_sort()
{
if constexpr (std::is_same_v<int, T>) {
// ...
} else {
// ...
}
}
};

对于以前的版本,常规if可能会产生错误(即使没有采用,两个分支都应该有效(。

因此,标签调度是一种简单的方法(SFINAE是另一种(:

template <typename> struct Tag{};
template<typename T, size_t N>
class Container
{
private:
void quick_sort(tag<int>)
{
// ...
}
template <typename U>
void quick_sort(tag<U>)
{
// ...
}
public:
void quick_sort()
{
quick_sort(Tag<T>());
}
// Some code ...
};