如何确定非多态类型的mixin模板的类型兼容性
How to determine type compatibility for a mixin template of a non-polymorphic type
如果我有一个mix-in定义为…
template<class T> class Mixin : public T
{
// mixin methods and members
};
…并声明T是一个非多态类…
Mixin<NonPoly> mixin;
. .然后有一个基类指针指向它。
NonPoly* nonPolyPtr = &mixin;
…我以后怎么能确保nonPolyPtr是指向一个Mixin类型?
dynamic_cast<Mixin*>(nonPolyPtr)
上面的代码不能编译,因为基类是非多态的。
我看到Boost有一些trait类可能有帮助,但我希望有一个更简单的解决方案,我忽略了
我认为你看错了需求。这里不需要进行任何类型转换,但可能需要对代码进行一些重构。如果你有一个类a的关系,它创建了mixin, B使用NonPoly,那么只需传递给B NonPoly指针,并直接在a中使用mixin。应该没有理由放弃a中的类型信息,只是为了再次获得它。如果有更多的类,将它们分为了解mixin的类和了解NonPoly的类,它们的关系是一样的。
如果一开始就是这种情况,mixin设计很可能不是正确的方法。通常,当需要简单的包含时使用mixins。在我上面的A和B的例子中,你可能有一个Mixin类
template <typename T>
class Mixin
{
T * GetObject()
{ return & t_; }
// other methods that use t_
private:
T t_;
};
,然后在需要对对象进行操作时传递该对象。或者更常见的是,如果你只是将T传递给一些第三方库,你根本不需要mixin。遏制甚至可能不是最好的。当你可以通过类型T的公共接口和公共第三方例程来操作它时,维护封装的最佳方法总是编写文件作用域算法。
如果你能解释为什么你认为你需要失去了类型信息,然后恢复,我们可以更清楚地展示如何重组所有权,这样不需要发生,但因为这类型信息从未离开运行时(因为你想把你的问题意味着它不是连载或任何东西),我可以向你保证,有一些设计,类型信息不会丢失。
如果您确定它的类型,只需使用static_cast
向下转换。您还需要在强制转换Mixin<NonPoly>*
中指定模板参数。
template<class T>
class Mixin : public T
{
// mixin methods and members
};
class NonPoly {
};
int main() {
Mixin<NonPoly> mixin;
NonPoly* nonPolyPtr = &mixin;
Mixin<NonPoly>* mixinPtr = static_cast<Mixin<NonPoly>*>(nonPolyPtr);
}
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 类型定义之间的兼容性问题
- boost::function<void (int)> 类型兼容性,是怎么做到的?
- 如何确定非多态类型的mixin模板的类型兼容性
- 更改C++类成员指针类型时的兼容性