gpt4 book ai didi

C++ 类重载 : is it possible to make compiler see which one to use based on template?

转载 作者:行者123 更新时间:2023-11-28 08:13:34 25 4
gpt4 key购买 nike

我已经创建了 N 个类,这些类将 1 到 N 个整数带入构造函数(我希望这就足够了)但看来我错了。

这里有 2 个示例类:

template < class T0 , class T1>
class my_map {
typedef T0 type_0;
typedef T1 type_1;
std::map<std::string, type_0* > T0_var;
std::map<std::string, type_1* > T1_var;
friend class apitemp;
public:
my_map( int meaningless0 = 42 , int meaningless1 = 42 ) {}
class apitemp {
std::string n_;
my_map* p;
public: apitemp(std::string name_, my_map* parent) : n_(name_), p(parent) {}
operator type_0*() {return p->T0_var[n_] ; }
operator type_1*() {return p->T1_var[n_] ; }
};
void insert(std::string name, type_0* ptr)
{ T0_var[name] = ptr; }
void insert(std::string name, type_1* ptr)
{ T1_var[name] = ptr; }
apitemp operator[](std::string n_) {return apitemp(n_, this);}
};

template < class T0>
class my_map
{
typedef T0 type_0;
std::map<std::string, type_0* > T0_var;
friend class apitemp;
public:
my_map( int meaningless0 = 42 ) {}
class apitemp
{
std::string n_;
my_map* p;
public:
apitemp(std::string name_, my_map* parent) : n_(name_), p(parent) {}
operator type_0*() {return p->T0_var[n_] ; }
};
void insert(std::string name, type_0* ptr)
{ T0_var[name] = ptr; }
apitemp operator[](std::string n_) {return apitemp(n_, this);}
};

顺序无关紧要...当两个类都存在时我无法编译我的代码,当一个被注释时(并且我们仅使用 2 个类中的一个的 API)一切都会编译...但是当我尝试使用我都收到编译器错误...所以我想知道如何使这些类可重写?

最佳答案

您不能像您尝试的那样在类型参数的数量上“重载”模板。对此限制的正确 react 取决于你究竟想做什么。

看来您的目的是制作一个map,将字符串映射到可变数量的值(在编译时设置)。但是您已经有了这样一个模板化容器:std::map 本身!

// This maps to int
std::map<std::string, int> map_to_int;

struct foo {
std::string str;
int i;
};

// This effectively maps to 2 fields
std::map<std::string, struct foo> map_to_struct;

// etc etc

如果允许你写

std::map<std::string, std::string*, int*> does_not_compile;

上面的 map_to_struct 没有给你的任何东西都不会给你。

关于C++ 类重载 : is it possible to make compiler see which one to use based on template?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8377037/

25 4 0