在C ++中没有模板的模板类的decltype

时间:2018-07-17 12:01:09

标签: c++ class templates decltype type-deduction

我有一个模板函数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 >,但是我只想拥有object

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

1 个答案:

答案 0 :(得分:3)

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

我不知道有什么方法可以直接推断出实例化类型的原始模板。您可以做的是定义一个帮助器类模板,并部分地进行匹配以匹配参数类型是具有单个类型参数的模板的实例的情况。这样,您可以推断出给定object实例的模板以及参数类型。在此帮助器模板中,然后可以有一个成员别名模板,该模板将再次为您提供一个object实例以及一个用于转发参数类型的别名

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)>();