将C ++模板类隐藏在通用接口后面

时间:2013-12-02 14:25:00

标签: templates polymorphism

我对模板很新 我有下面的代码,我试图隐藏基础接口类后面的模板类。 它现在有效,但我不知道它是否是我尝试做的好方法。 例如,是否可以在一个常用函数中收集insertItem()函数?

struct MyMainClass
{
    virtual void writeFirstItem() = 0;
    virtual void insertItem(int Key, int Value) = 0;
    virtual void insertItem(void* Key, int Value) = 0;
};

template<typename T>
struct MyTempClass : public MyMainClass
{
    template<typename T>
    struct cmp_str
    {
        bool operator()(typename T const a, typename T const b) const
        {
            if(a > b)
                return true;
            return false;
        };

    };

    template<>
    struct cmp_str<wchar_t*>
    {
        bool operator()(wchar_t* const a, wchar_t* const b) const
        {
            return std::wcscmp(a, b) < 0;
        };
    };

    template<>
    struct cmp_str<char*>
    {
        bool operator()(char* const a, char* const b) const
        {
            return std::strcmp(a, b) < 0;
        };
    };

    typedef std::map<typename T, int, cmp_str<typename T> > Mymap;
    typedef typename Mymap::const_iterator mymapit;

    typename Mymap mymap;

    template<typename T>
    void insert(T keyVal, int myvalue)
    {
    mymap[keyVal] = myvalue;
    };

    void writeFirstItem()
    {
        std::wcout << std::wstring(L"(") << mymap.begin()->first << L"," << mymap.begin()->second << L")" << std::endl; 
    }

    void insertItem(void* Key, int Value)
    {
        insert((T)Key, Value);
    }

    //this one shouldnt be called
    void insertItem(int Key, int Value){}
};

template<> template<>
void MyTempClass<int>::insert<int>(int keyVal, int myvalue)
{
    mymap[keyVal] = myvalue;
}

template<>
void MyTempClass<int>::insertItem(int Key, int Value)
{
    insert(Key, Value);
}

int wmain(int argc, wchar_t* argv[])
{

    MyMainClass* a;
    MyMainClass* b;
    MyMainClass* c;

    wchar_t a1[6] = L"asdf";
    wchar_t a2[6] = L"12345";
    wchar_t a3[6] = L"xyzs";
    wchar_t a4[6] = L"12345";

    int b1 = 3;
    int b2 = 5;
    int b3 = 88;
    int b4 = 3;

    char c1[6] = "casdf";
    char c2[6] = "c1234";
    char c3[6] = "cxyzs";
    char c4[6] = "c1234";

    a = new MyTempClass<wchar_t*>;
    a->insertItem(a1,3);
    a->insertItem(a2,5);
    a->insertItem(a3,9);
    a->insertItem(a4,3);


    b = new MyTempClass<int>;
    b->insertItem(b1, 4);

    c = new MyTempClass<char*>;
    c->insertItem(c1,77);
    c->insertItem(c3,99);

    a->writeFirstItem();
    b->writeFirstItem();
    c->writeFirstItem();
}

2 个答案:

答案 0 :(得分:0)

我猜你有什么类型的重新定义。这是因为当你在没有“else”部分进行编译时,只有一个cmp_str特化实际上是“实例化”,当你取消注释“else”时 - 另一个“struct cmp_str”出现在同一个翻译单元中。 请告诉我们您尝试使用此组合实现的目标。

答案 1 :(得分:0)

问题是insert()的第一个参数类型不正确。

当您实例化MyTempClass<int>时,insert()函数的签名变为: void insert(int keyVal, int myvalue);但是,您插入的调用网站似乎是b->insert(a1, 3);,其中a1不属于int类型。