C ++如何创建不允许模板参数的类模板

时间:2018-11-25 19:54:14

标签: c++ class templates template-deduction

如果标题令人困惑,我深表歉意。我想要做的是创建一个从头开始实现std :: map的类模板。我要实现的是不要在模板参数中使用特定的数据类型。请参见下面的代码:

#include "pch.h"
#include <iostream>
#include <string>

using namespace std;
template<typename T, typename N>

class MyCustomMap{
    public:
    MyCustomMap();
    T* keys;
    N* values;
};

template<typename T, typename N>
MyCustomMap<T, N>::MyCustomMap(){
    this->keys = new T[10];
    this->values = new N[10];
}
....
....
int main(){
    MyCustomMap<int,string> map; //This works because I specified the argument list
    MyCustomMap map; //This is my goal

    // The main goal is to call Insert one after another with different data types
    map.Insert(1, "Test");
    map.Insert("Test2", 2);

    return 0;
}

这可能吗?感谢您的任何帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

  

MyCustomMap map;

     

这可能吗?

简短回答:否。

长答案:如果您将一些参数传递给构造函数

MyCustomMap map{1, "one"};

有可能推论int的{​​{1}}和T的{​​{1}}。

但是,不幸的是,仅从C ++ 17开始;请查看this page,以了解更多信息。

但是,如果不将参数传递给构造函数,则无法推断参数。

编辑

OP精确

char const [4]

对不起:我误解了你的问题。

但是答案仍然是:否。

C ++是一种经过编译的强类型语言。

模板类不是类:是一组类。

实例化对象

V

此对象(在这种情况下为// The main goal is to call Insert one after another with different data types map.Insert(1, "Test"); map.Insert("Test2", 2); )必须是精确类型的对象;编译器在那个精确位置就知道了。

因此,您无法实例化类型为MyCustomMap map; 的{​​{1}}。您必须选择几种类型。可能具有默认值,可能通过构造函数参数推导类型,可能使用map类型并使用函数返回的类型,但是在声明变量时必须选择类型。不会。

而且,无论如何,

map

您想要两种不同类型的当代物品。

在C ++ 17中有朝着这个方向发展的东西:寻找MyCustomMapauto。但是不够灵活。