1

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

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

这是代码的精简版本来解释我的问题。

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?
};
4

1 回答 1

2

问题是您已经分别对两种类型进行了类型擦除AB因此在您的代码翻译中没有任何类型AB已知的地方。

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

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


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

Suppose that your program has three compilation units; A.cpp calls setA with a range of types T[A], B.cpp calls setB with another range of types T[B], and C.cpp owns the Problem object and wants to call someTemplateFunction. Then there's no time during compilation when the compiler knows both the range of types in A.cpp and the range of types in B.cpp, so it can't instantiate someTemplateFunction with the appropriate cross-product T[A] x T[B].

于 2012-09-06T16:14:27.720 回答