gpt4 book ai didi

c++ - 用模板专门化模板

转载 作者:太空狗 更新时间:2023-10-29 20:29:34 26 4
gpt4 key购买 nike

我有一个(免费的)函数模板,看起来像这样

template <typename T>
T get();

我现在想将这个函数专门用于一个类,它本身就是一个模板。但是我的编译器不想编译它,我现在问这是否可能以及我如何实现它。仅出于想法,代码可能如下所示:(不编译)

template <>
template <typename T>
foo_type<T> get<foo_type<T>>()

最佳答案

您正在做的是函数模板的部分特化。但是函数模板的部分特化是不允许的。函数模板的重载是允许的,但在这种情况下,也是不可能的,因为函数只有返回类型,并且不允许对返回类型进行重载。

所以解决方案是这样的:

namespace details
{
template <typename T>
struct worker
{
static T get();
};

template <typename T> //partial specialization of class is allowed
struct worker<foo<T>>
{
static foo<T> get();
};

}

template <typename T>
T get()
{
return details::worker<T>::get();
}

如果您将重载定义为采用一个参数以使重载有效,您也可以使用重载:

namespace details
{
template <typename T>
static T get(T*);

template <typename T>
static foo<T> get(foo<T>*); //now the overload is valid

}

template <typename T>
T get()
{
return details::get<T>(static_cast<T*>(0));
}

注意参数 static_cast<T*>(0)用于帮助编译器选择正确的重载。如果T不是foo<U> , 那么第一个重载将被选择为传递给它的参数类型将是 T*而不是 foo<U>* .如果Tfoo<U> ,那么编译器将选择第二个重载,因为它专门化,并且可以接受传递给它的参数 foo<U>*在这种情况下。

关于c++ - 用模板专门化模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9542597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com