模板参数的C ++部分类型推断 - 可能吗?

时间:2014-07-31 14:18:02

标签: c++ templates types type-inference

我有一种情况,我有这样的嵌套结构:

struct A
{
    struct B
    {};
};

我有一些模板代码需要知道OUTER类型(在这种情况下,' A')。 所以我试图编写一个可以推断外部类型的模板函数,它看起来像这样:

template<typename T>
void func(typename T::B item)
{}

int main()
{
    A::B item;
    func(item);   // Error here because "candidate template ignored: couldn't infer template argument 'T'"
    return 0;
}

它没有编译,原因在上面的评论中给出。


现在,我当然可以将模板简化为类似的东西,但正如您在下面所看到的那样,它不能满足我对于知道&#34;外部&#34;类型,即A。

template<typename T>
void func(typename T item)
{
    // Oops, I now have the complete type of A::B but I have a
    // specialized function that needs the A without the B as the type parameter
    someOtherFunc<???>(...);   // The ??? needs to be type A only, without the B
}

1 个答案:

答案 0 :(得分:3)

您可以在班级B中添加typedef A outerType; 那么func的实现可能是:

#include <iostream>

struct A{
struct B {
    typedef A outerType;
};
};

template <class T>
void func( T f)
{
    typedef typename T::outerType outerType;
    outerType a;
    someotherfunc(a);
}   

int main ()
{
    A::B item;
    func(item);

    return 0;
}

当然,你所拥有的每个内部类都应该将其外部类型命名为outerType,以使func能够解决外部类型。