处理运行时类型未知的模板
Handle templates with unknown until runtime type
我试着睡在这个上面,但还是迷路了。我什至不确定我应该使用什么搜索词。有人可以指出我正确的方向吗?
我想要这样的东西:
template < typename Interim >
class phase_one
{
Interim do_something () ;
}
template < typename Output, typename Interim >
class phase_two
{
Output do_something_more ( Interim ) ;
}
template < Output >
class main_class
{
phase_one m_first;
phase_two m_second;
Output do_main ( )
{
return m_second.dosomething_more( m_first.do_something() );
}
}
希望你能从伪代码中看到我需要存储和调用这两个模板类。但是Interim
类型直到运行时才知道。我事先唯一知道的是Output
类型以及两个阶段都有一个共同类型的事实。
如何存储这些对象以及如何使它们协同工作?这是需要类型擦除的实例吗?
编辑: phase_one
将是一个std::codecvt
,phase_two
将是我创作的另一个codecvt
。我需要根据phase_one
选择phase_two
。所有这些都是在运行时读取文件的 BOM 后完成的。
我宁愿在没有 boost 或 c++11 的情况下执行此操作。如果有这样做的 boost 方法,我会有兴趣看到它,但它必须在没有 boost 库的情况下实现,即使我必须自己创建一个类似的方法/模板。
我修改了你的main_class模板。基本上让它知道Interim
类型
template < typename Interim >
class phase_one
{
Interim do_something () ;
}
template < typename Output, typename Interim >
class phase_two
{
Output do_something_more ( Interim ) ;
}
template < typename Output, typename Interim >
class main_class
{
phase_one<Interim> m_first;
phase_two<Output, Interim> m_second;
Output do_main ( )
{
return m_second.dosomething_more( m_first.do_something() );
}
}
你实例化main_class喜欢
int main () {
if (some condition) {
main_class<char, unsigned long> m;
m.do_main();
} else {
main_class<char, unsigned short> m;
m.do_main();
}
}
这对你有用吗?
我想提出非C++解决方案。
对于这种情况,我想说你需要知道可能的临时类型。
即使对于像 C# 和 Java 这样的语言,它们可以在运行时获得类型,您仍然需要清除知道可能的类型集,否则如何确保您的代码对该类型有意义?
因此,基于@ubi答案,编写一个开关来处理它,如果编写一个大型开关案例来处理每种类型的成本很高,建议您编写一个脚本工具,以便在编译项目时从可能的临时类型列表中生成代码。
你不想要提升,但boost::variant 也许可以在这里帮助你。它允许您定义"联合"类型,其中变量可以存储许多可能类型之一。然后,您可以应用一个函数(称为"访问者"(,该函数的运行时取决于变体中实际存储的数据类型。我发现它很快就会变得非常笨拙,但它可能会帮助你。
我想象你把你的m_first
定义为一个boost::variant
,然后用声明你的phase_one::do_something
作为"访客"类的operator()
,所以你的行会变成这样:
Output do_main ( )
{
return m_second.dosomething_more(
boost::apply_visitor( phase_one(), m_first ) );
}
也许这不是你要找的,而是需要考虑的事情。
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 具有未知值时的时间复杂性
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 读取文件时运行时的未知行为
- 当数组大小在C++中未知时,如何在运行时将对字符串数组的引用作为函数参数传递?
- 向 Kattis 在线评委提交 c++ 程序时出现未知运行时错误
- 将未知结构(在运行时)作为模板参数传递
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 地址清理器和运行时加载动态库 ->(<未知模块>)
- std :: list(双重链接列表)未知运行时错误
- 创建未知数量的对象,每个对象在运行时 c++ 具有特定的对象名称
- 在运行时之前调用类型未知的模板化函数
- 处理运行时类型未知的模板