我有一个模板函数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
的模板参数传递?
答案 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)>();
?