3

我试着睡在上面,但还是迷路了。我什至不确定我应该使用什么搜索词。有人可以指出我正确的方向。

我想要这样的东西:

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::codecvtphase_two另一个codecvt创作。我需要phase_two根据phase_one. 所有这些都是在运行时完成的,在读取文件的 BOM 之后。

我宁愿在没有 boost 或 c++11 的情况下这样做。如果有这样做的 boost 方法,我会有兴趣看到它,但它必须可以在没有 boost 库的情况下实现,即使我必须自己创建一个类似的方法/模板。

4

3 回答 3

0

我修改了你的 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();
    }

}

这对你有用吗?

于 2013-07-18T02:34:10.863 回答
0

我知道你不想要提升,但boost::variant或许可以帮助你。它允许您定义一个“联合”类型,您的变量可以存储多种可能类型中的一种。然后,您可以应用一个函数(称为“访问者”),该函数由运行时确定,具体取决于变量中实际存储的数据类型。我发现它很快就会变得非常笨拙,但它可能会对你有所帮助。

我正在想象您将您定义m_first为 a boost::variant,然后使用将您声明phase_one::do_somethingoperator()“访问者”类的,因此您的行将变为:

Output do_main ( )
{
    return m_second.dosomething_more(
       boost::apply_visitor( phase_one(), m_first ) );
}

也许这不是您要寻找的东西,而是需要考虑的东西。

于 2013-07-18T16:16:20.647 回答
0

我想提出非 C++ 解决方案。

对于这种情况,我想说你需要知道可能的 Interim 类型。

即使对于像 C# 和 Java 这样可以在运行时获取类型的语言,您仍然需要清楚知道可能的类型集,否则如何确保您的代码对该类型有意义?

因此,基于@ubi answere,编写一个开关来处理它,如果编写一个大型开关案例来处理每种类型的成本很高,建议你编写一个脚本工具来从可能的临时类型列表中生成代码,当你编译你的项目。

于 2013-07-18T10:04:57.863 回答