T - > std :: vector <T>的模板专业化

Sal*_*gat 6 c++ templates

我有一个模板类方法

template<class T>
T pop<T>();
Run Code Online (Sandbox Code Playgroud)

现在我想做一个模板专业化,如下所示,

template<class T>
std::vector<T> pop<T>();
Run Code Online (Sandbox Code Playgroud)

我可以做到以下没问题,

template<>
std::vector<int> classname::pop<std::vector<int>>();
Run Code Online (Sandbox Code Playgroud)

但我仍然需要将类型作为模板参数.我该如何做到这一点?


编辑:感谢Piotr我最终使用标签调度.下面是我最终做的代码,

// The public method that is accessed by class.push<std::vector<int>>(12);
template<class T>
void push(T data) {
    push(tag<T>(), data);
}

// The private method that calls the actual vector push for vector types
template<class T>
void push(tag<std::vector<T>>, std::vector<T> const& data_vector) {
    push_vector(data_vector);
}

// The actual implementation
template<class T>
void push_vector(std::vector<T> const& data_vector) {
// Actual implementation in here
}
Run Code Online (Sandbox Code Playgroud)

kir*_*sos 5

在我的头顶,我通常使用一个成员结构绕过它:

template <typename T>
struct pop_impl {
    static T pop(classname& x); // normal function
};

template <typename T>
struct pop_impl<std::vector<T>> {
    static std::vector<T> pop(classname& x); // specialized for std::vector<T>
};

template <typename T>
T classname::pop() { return pop_impl<T>::pop(*this); }
Run Code Online (Sandbox Code Playgroud)


cig*_*ien 2

此答案最初由Austin Salgat在问题Template Specialization for T -> std::vector 的正文中提供(在 CC BY-SA 3.0 许可证下发布),并已移至此处作为答案,以便遵守网站的问答格式。


感谢 Piotr,我最终使用了标签调度。下面是我最终所做的代码,

// The public method that is accessed by class.push<std::vector<int>>(12);
template<class T>
void push(T data) {
    push(tag<T>(), data);
}

// The private method that calls the actual vector push for vector types
template<class T>
void push(tag<std::vector<T>>, std::vector<T> const& data_vector) {
    push_vector(data_vector);
}

// The actual implementation
template<class T>
void push_vector(std::vector<T> const& data_vector) {
// Actual implementation in here
}
Run Code Online (Sandbox Code Playgroud)