代码之家  ›  专栏  ›  技术社区  ›  Clèm

C++中没有模板的模板类的解密

  •  0
  • Clèm  · 技术社区  · 6 年前

    我有模板函数模板 template< template< class > class Timg, class T > Timg< T > foo() 编译器无法为其推导类型。我可以用 foo< object, T >() ,在哪里 object 是模板类。我希望能够使用 decltype 或者类似的东西。

    这里有一个例子:第一个文件是 header.h

    template< class T >
    class object
    {
    };
    
    template< template< class > class Timg, class T >
    Timg< T > foo()
    {
            return Timg< T >();
    }
    

    第二个文件是 main.cpp

    #include "header.h"
    
    int main()
    {
            object< float > o;
            auto l_return = foo< object, float >(); // OK
            auto l_return2 = foo< decltype(o), float >(); // What I would like to achieve
            return 0;
    }
    

    这里的问题是 decltype(o) 退货 object< float > 但是我只想 对象 .

    我如何从变量中推断类型 o 将其作为函数的模板参数传递 foo ?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Michael Kenzel    6 年前

    object 是类模板,而不是类型。只有类模板的实例是类型。 object<float> 是一种类型。模板本身不是,它是一个模板…

    我不知道有什么方法可以直接推断类型是从中实例化的原始模板。您可以做的是定义一个助手类模板,并进行部分专用化,以匹配参数类型是具有单个类型参数的模板实例的情况。这样,您就可以同时推导出模板和给定的参数类型 对象 实例。在这个助手模板中,您可以有一个成员别名模板,它将为您提供 对象 实例以及转发参数类型的别名

    template <class T>
    struct deduce_object_template;
    
    template <template <class> class O, class V>
    struct deduce_object_template<O<V>>
    {
        template <class T>
        using object_t = O<T>;
    
        using type = V;
    };
    

    然后用这个打电话 foo 就像这样:

    foo<deduce_object_template<T>::template object_t, typename deduce_object_template<T>::type>();
    

    然而,我会严肃地质疑是否有一个更简单的方法来实现你想要实现的目标。您真的需要推导模板和参数类型吗?如果您只想创建一个类型参数是什么的对象,为什么不简单地定义第二个模板呢?

    template <class Timg>
    Timg foo()
    {
        return Timg();
    }
    

    然后打电话 foo<decltype(o)>(); ?