使用两个模板参数调用函数

时间:2012-09-06 16:09:37

标签: c++ templates

我在使用两个模板参数调用模板函数时遇到问题。

我有一个类,该类接受两种不同类型的对象。我还不知道类型,所以我把它们留作模板参数。然后我将对象存储在包装类中。最后,我希望能够使用两个模板参数调用模板化函数,这需要我的两个对象。但我很困惑如何做到这一点。

以下是解释我问题的代码的精简版本。

template<typename A, typename B>
void someTemplateFunction(A a, B b);


class Problem
{
  private:
    class WrapperA
    {
      public:
        virtual void doSomething() = 0;
    };

    template<typename A>
    class ConcreteWrapperA : public wrapperA
    {
      private:
        A a;
      public:
        ConcreteWrapperB(A b_) : a(a_) {}
        virtual void doSomething();
    };

    class WrapperB
    {
      public:
        virtual void doSomething() = 0;
    };

    template<typename B>
    class ConcreteWrapperB : public wrapperB
    {
      private:
        B b;
      public:
        ConcreteWrapperB(B b_) : b(b_) {}
        virtual void doSomething();
    };

    WrapperA *a;
    WrapperB *b;

  public:

    template<typename A>
    void setA(A a)
    {
      a = new ConcreteWrapperA<A>(a);
    }

    template<typename B>
    void setB(B b)
    {
      a = new ConcreteWrapperB<B>(b);
    }

    void call_someTemplateFunction(); // ??????? How do i do this?
};

1 个答案:

答案 0 :(得分:2)

问题在于,您已经分别对AB这两种类型进行了类型删除,因此在代码的转换中无处可见A和{{1}这两种类型已知。

如果您可以编写单个函数B,那么您可以在该点捕获对类型template<typename A, typename B> void set(A, B)

或者,<A, B>是否可以在不同时知道someTemplateFunctionA这两种类型的情况下进行操作?


这是将C ++设计为单程独立编译语言的基本问题。

假设您的程序有三个编译单元; B使用A.cppsetA种类型T[A]调用B.cpp来调用另一种类型setBT[B]拥有C.cpp对象并想要致电Problem。编译时没有时间编译器知道someTemplateFunction 中的类型范围和<{em} A.cpp中的类型范围,因此无法实例化{{1}使用适当的交叉产品B.cpp