c++ - 解决嵌套模板参数函数的基类歧义
问题描述
我有类 foo_impl、bar_impl 派生自派生类 foo_derived、bar_derived 和一个接受模板模板参数的函数:
#include <iostream>
template <typename T>
struct foo_base
{
T a;
};
template <typename T>
struct foo_derived: public foo_base<T>
{
};
struct foo_impl: public foo_derived<int>
{
};
template <typename T>
struct bar_base
{
T a;
};
template <typename T>
struct bar_derived : public bar_base<T>
{
};
struct bar_impl : public bar_derived<int>
{
};
template <typename T, template <class> typename Base>
void useBase(const Base<T>& Arg)
{
std::cout << Arg.a << std::endl;
}
int main()
{
foo_impl foo;
bar_impl bar;
useBase(foo); // ‘const Base<T>’ is an ambiguous base class of ‘foo_impl’
useBase(bar); // ‘const Base<T>’ is an ambiguous base class of ‘bar_impl’
}
是否可以指定我希望 foo_base 和 bar_base 是唯一可以传递给 useBase(.) 的类型?
编辑:我尝试引入一个概念以限制接受的类型,但编译器仍然不满意。
template <typename T, template <class> typename Base>
concept is_base = !std::is_same<std::is_same<Base<T>, foo_base<T>>, std::is_same<Base<T>, bar_base<T>>>::value;
template <typename T, template <class> typename Base>
void useBase(const Base<T>& Arg) requires is_base<T, Base>
{
std::cout << Arg.a << std::endl;
}
解决方案
正如评论中所述,重载可能是一种可能性:
template <typename T, template <class> typename Base>
void useBaseImpl(const Base<T>& Arg)
{
std::cout << Arg.a << std::endl;
}
template <typename T>
void useBase(const foo_base<T>& arg)
{
useBaseImpl(arg);
}
template <typename T>
void useBase(const bar_base<T>& arg)
{
useBaseImpl(arg);
}
推荐阅读
- mysql - 从远程主机连接到 mysql 数据库
- javascript - 我可以在 pouchdb upsert 中将变量作为键传递吗
- python - Python中没有通用的对象序列化方法(到json)?
- apache-spark - 使用 reduceByKey 会抛出 int object is not subscriptable 错误
- c++ - 在 C++ 中调用 map 的任何函数之前转换键
- sql - 依靠 Rails Active Record 中的嵌套模型
- javascript - jQuery不一致的相对路径
- ios - 无法将作为自定义视图实现的 UILabel 的文本颜色设置为 UIBarButtonItem
- python - sharepoint 服务器是否接受 http 标头中的“范围”请求?
- python-3.x - terraform 部署的 EC2 上的 Python 应用程序无法访问机密