如何解决C++ 中类型组合的多重继承和不明确的调用
我有一个类型列表:
template<typename T,typename... Ts>
struct type_list
{
using head = T;
using tail = type_list<Ts...>;
};
template<typename T>
struct type_list<T>
{
using head = T;
using tail = Nil;
};
using my_tuple = type_list<int,double,char>;
我想创建函数 add
的所有可能重载,它能够接收此列表中的任何类型对,即
add(int,int);
add(int,double);
add(int,char);
...
add(char,char);
使用这种方式可以实现这一点(我自己想出来的):
template<typename T1,typename TypeList>
struct Pair : virtual Pair<T1,typename TypeList::tail>
{
using first_type = T1;
using second_type = typename TypeList::head;
/* Problems are here! :(
using Pair<T1,typename TypeList::tail>::add;
std::common_type_t<first_type,second_type> add(first_type lhs,second_type rhs) {
return lhs + rhs;
}
std::common_type_t<first_type,second_type> operator+(second_type lhs,first_type rhs) {
return lhs + rhs;
}
*/
Pair()
{
std::cout << "Pair\t" << typeid(first_type).name() << " - " << typeid(second_type).name() << std::endl;
}
};
template<typename T1>
struct Pair<T1,Nil>
{
using first_type = T1;
using second_type = Nil;
//void add() {}
Pair()
{
// Works as I excepted!
std::cout << "Pair\t" << typeid(first_type).name() << " - " << typeid(second_type).name() << std::endl;
}
};
template<typename TypeListT>
struct combine : virtual Pair<typename TypeListT::head,TypeListT>,virtual combine<typename TypeListT::tail> {};
template<>
struct combine<Nil> {};
如果你为了查看控制台输出而去掉 add
(只是注释)函数,你会得到:
Pair int - struct Nil;
Pair int - char;
Pair int - double;
Pair int - int;
Pair double - struct Nil Pair double - char;
Pair double - double;
Pair char - struct Nil;
Pair char - char
粗略地说,在我开始引入 add
函数之前,这是我期望得到的结果。
combine<type_list<int,char>> c;
c.add(5.0,6.0);
add
被模棱两可地调用,无论我尝试过什么修复。我知道我粗略地使用了多重继承,现在我正在努力解决这个歧义问题,但我想避免显式 static_cast
,因为这里我们有很多基类。
我如何改变我的方式来允许这个方法使用方法 add
并避免歧义?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。