2009-12-29 60 views
1

我正在处理一些生成的具有破损多态性的类。对于每个生成的类T,都有一些T_type_info,T_writer,T_reader类,这些类仅在概念上与T有关。模板返回类型/演示为模板的功能

我想要做的是这样的:

template <class T> class Wrapper 
{ 
public: 
    template <class W> W topic_cast(BrokenBaseClassWriter* p); 
    // other operations with the same problem ... 
}; 

template <> class Wrapper<MyTopic> 
{ 
public: 
    template <> MyTopicWriter* topic_cast(BrokenBaseClassWriter* p) { ... } 
}; 

所以,我可以做这样的事情:

void Write(const Wrapper<T>& topic) 
{ 
    BrokenBaseClassWriter p = not_important; 
    topic.topic_cast(p)->do_stuff(); 
} 

我的T类是从IDL生成是概念存在于应用程序空间。它们不是来自任何东西。在我上面的例子中,W并不是一个独立的参数,它是“不依赖于T的东西”。我试图在应用程序中保留T的所有知识,并在后端保留T'的所有知识(不知道T)。

然而,编译器说我的topic_cast函数不是模板函数 - 我想是因为模板出现在返回类型中,并且它不会与任何其他实例区分开来。我知道(模板只有返回类型不同)是不合法的。只有在我的情况下,它确实是独一无二的,因为W不是一个独立的参数。但与编译器争论很少有帮助。

我可以这样做,还是有另一种方法来做到这一点“铸造为模板类型的功能”?

回答

1

难道这不是用特质系统实现的吗?

template <typename T> struct my_traits 
{ 
}; 

template <> struct my_traits<MyClass> 
{ 
    typedef MyWriter writer_type; 
}; 

template <typename T> struct Wrapper 
{ 
    typename my_traits<T>::writer_type topic_cast(); 
}; 
+0

这就是我正试图用我上面建造的方形轮到达。封装不再需要 - 类型映射是其最初的目的。谢谢 – swarfrat

0

这可不行:

topic.topic_cast(p)->do_stuff(); 

因为编译器无法推断返回类型。
所以,你必须明确地告诉你想要什么返回类型,编译器:

topic.topic_cast<MyType>(p)->do_stuff(); 

您提供的实现是一个特定的类型。
所以,当你使用特定类型的代码将被制作:

0

这个用gcc编译:

class BrokenBaseClassWriter; 
class MyTopic; 
class MyTopicWriter; 

template <class T> class Wrapper 
{ 
public: 
    template <class W> W *topic_cast(BrokenBaseClassWriter* p); 
    // other operations with the same problem ... 
}; 




template <> template<> 
MyTopicWriter *Wrapper<MyTopic>::topic_cast<MyTopicWriter>(BrokenBaseClassWriter* p) 
{ 
    return 0; 
} 


int main(int argc, int argv) 
{ 
    BrokenBaseClassWriter* p = NULL; 
    Wrapper<MyTopic> caster; 
    MyTopicWriter *casted = caster.topic_cast<MyTopicWriter>(p); 
} 

当然,它仍然暴露在MyTopicWriter你的主代码...