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