2011-08-17 93 views
-4

我想修改在编译时给出的模板类型,但无法做到这一点。让我们看看你是否有一些想法。编译时是否可以编辑模板名称?

让我们考虑我们有2个类A和A_test和一个模板类B. 将实现B类,因为它有一个函数b_f(),它内部创建模板类的对象并调用public funcion A_f()/A_test_f()的A类或A_test类。

from main,将创建class B obj; obj.b_f(); 但我想创建类A_test的对象不是A级。

让我知道是否有可能。

Basicaly我想做对象注入。请让我知道是否有可能。

+2

请输入密码?发布一些代码以向我们展示你究竟做了什么以及你到底做了些什么! – Nawaz

+2

你想要做什么?因为我真的不知道你在处理什么。 –

+0

如果您想控制b_f运行的类型,您需要将它传递给类型... – PlasmaHH

回答

1

到目前为止,最好的解决方案是尝试将A_test_f()重命名为与A_f()相同。

如果证明是不可能的,接下来的事情我会尝试是专门B类:

template<class AT> 
class B { 
public: b_f() { 
    AT m_A; 
    m_A.A_f(); 
}; 

template<> 
class B<A_test> { 
public: b_f() { 
    AT m_A; 
    m_A.A_test_f(); 
}; 

如果B是太复杂了,还有其他的东西来尝试,但你可能要重新考虑你首先要做。如果一切都失败了,请按照我在此处编码的内容进行操作,但将其称为B_HELPER而不是B,然后b_f()可以这样做:B_HELPER<AT> m_A; m_A.b_f();这样您就不必重新编码B的全部内容。

0

在编译时向模板注入依赖关系的常用方法是通过类型特征。这允许通过具有该类的特定知识的另一个结构或类从外部自定义模板。标准库中的示例包括std::char_traits<>std::iterator_traits<>。 Boost也定义了一些,包括boost::type_traits<>

特征涉及为一般情况定义结构,并在必要时将其专门用于替代情况。

// general case: select method named "f". 
template<class T> struct b_traits 
{ 
    typedef void(T*F)(); 
    static const F f = &T::f; 
}; 

    // template type that forwards method selection to "b_traits" struct. 
template<class AT> 
class B { 
public: b_f() { 
    AT m_A; 
    (m_A.*(b_traits<AT>::f))(); 
}; 

class A_test { ... }; 

    // special case: select method named "A_test_f". 
template<> struct b_traits<A_test> 
{ 
    typedef void(T*F)(); 
    static const F f = &A_test::A_test_f; 
}; 

int main() 
{ 
    B<A_test> b; 
    b.b_f(); // will invoke "A_test::A_test_f()" rather than "A_test::f()". 
}