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

标签 c++ class templates arguments containers

有什么方法可以调用只包含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 ...
};

关于c++ - 具有2个模板参数的C++类,具有1个参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62326300/

相关文章:

c++ - 类模板和类型

c++ - 为什么打印B的时候多了一个空行?

c++ - 全局变量和静态全局变量

c++ - 如何将 Visual Studio 中的“查找所有引用”仅限于相关变量

java - Bat 文件设置类路径

c++ - 是否有可能有一个像 'template<class T> X(){}' 这样的模板化构造函数?

c++ - 使用具有非 constexpr 值的 int 模板函数

c++ - 将 std::vector 重命名为另一个类以进行重载?

c++ - 友元函数无法访问类 C++ 的成员

c++ - 我如何访问静态类成员?