【问题标题】:c++ specialize a member function for vectorc ++专门为vector创建一个成员函数
【发布时间】:2014-03-25 09:32:05
【问题描述】:

我是 C++ 新手,我正在学习使用模板。 我想制作一个带有 2 个模板参数的模板类,并专门化该类中的单个成员函数,以防第二个模板参数是模板化在第一个参数的指针类型上的向量。我认为我尝试过的一个例子会更清楚:

//Container.h:

template<class T ,   class CONT  >
class Container {

private:
    CONT container;
    T    someData;
public:
    void foo();
};

我试过的 std::vector 的特化是:

//Container.cpp

template<class T>
void Container<T, std::vector<T*> > ::foo(){
     cout << "specialized foo:  " << container.pop_back(); 
    }

template<class T, class CONT  >
void Container<T, CONT > ::foo(){
     cout << "regular foo: " << container.pop_back());
}

但我得到了这些错误:

error C3860: template argument list following class template name must list parameters in the order used in template parameter list
error C2976: 'Container<T,CONT>' : too few template argument

Container 类的用法必须是第一个参数是某种类型,第二个参数是 STL 容器、向量或列表。例如:

Container<int, vector<int*> > c;
c.foo();

我哪里错了?

【问题讨论】:

  • 除了语法错误,不能部分特化函数模板,所以这种方法行不通。

标签: c++ templates stl


【解决方案1】:

在类模板中定义成员函数的正确语法是

template<class T, class CONT > 
void Container<T, CONT>::foo()
{
     cout << "specialized foo:" ; 
}

foo() 函数 没有重载和重新定义。 foo() 函数的重新定义也会产生错误。您不能根据返回类型重载函数。 std::vector 的特化不正确。

cout &lt;&lt; container.pop_back();

【讨论】:

  • 我编辑了语法错误,除此之外,您可以假设运算符
【解决方案2】:

您可以使用基于策略的设计。现在有很多变化,但一个简单的例子就是这样

#include <iostream>
#include <vector>

using namespace std;

template<typename T, class CONT>
struct foo_policy {
    static inline void execute() {
        cout << "regular foo: \n" ;
    }
};

template<typename T>
struct foo_policy<T, std::vector<T*>> {
    static inline void execute() {
        cout << "specialized foo: \n" ;
    }
};

template<class T ,   class CONT  >
class Container
{
private:
    CONT container;
    T    someData;
public:
    void foo()
    {
        foo_policy<T, CONT>::execute();
    }
};

int main() 
{
    Container<int, std::vector<int>>  a;
    Container<int, std::vector<int*>> b;
    a.foo();
    b.foo();
    return 0;
}

Here's a demo。在另一种情况下,您可以从 foo_policy 类派生 Container 并使用基成员的函数(但那里有更复杂的含义)

【讨论】:

  • 谢谢,我想它会完成这项工作,但我认为有一种更直接的方法可以实现这一目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多