【问题标题】:C++ Class with 2 template arguments, function with 1 argument具有 2 个模板参数的 C++ 类,具有 1 个参数的函数
【发布时间】:2020-10-01 05:02:18
【问题描述】:

有什么方法可以调用只接受 1 个模板参数而不是 2 个的类成员函数?

我想写一些这样的代码:

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

}

【问题讨论】:

  • 为什么不template&lt;size_t N&gt; void Container&lt;int, N&gt;::quick_sort() { }
  • @ThomasSablik 模板参数列表必须与参数列表匹配
  • 如果你打算对int-s 有一个特殊的排序算法,那么使用tag-dispatching
  • 这里缺少很多上下文,但是您的模板参数不是针对函数的,而是针对类的。你想要int的容器的特殊功能吗?
  • @molbdnilo 是的

标签: c++ class templates arguments containers


【解决方案1】:

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

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 ...
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2018-12-16
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多