我没有很多使用模板的经验,但我正在尝试使用带有返回不同类的函数的枚举进行模板专业化。下面是示例代码(或者我正在尝试完成的代码):
class Foo {
// member variables
};
class Cat {
// member variables
};
enum MyType{ A, B, C};
// Header file
template<class T, MyType U> std_shared_ptr<T> process();
// cpp file / implementation
template<> std_shared_ptr<Foo> process<Foo, A>()
{
}
template<> std_shared_ptr<Cat> process<Cat, C>();
{
}
有人可以帮我弄清楚我在这里错过了什么或做错了吗?我尝试搜索它并找到一些处理枚举类型(Template specialization for enum)的解决方案,但是,无法弄清楚如何将它与函数中的模板返回类型放在一起。
编辑: 我在这里尝试做的是基于枚举类型作为函数的参数进行模板特化。同样的函数也返回一个模板类。所以函数在这里有两个模板:T(返回参数)和U(输入参数,它是一个枚举)。是否可以这样做?
编辑: 修改了上述样本以获得正确的行为。
答案 0 :(得分:2)
您不能部分专门化模板功能。
函数参数的值而不是类型不能更改返回值的类型。非类型模板参数的值可以更改返回值的类型,但是该值在<>
内传递,并且必须在编译时确定,而不是在()
s内。
标签可能有帮助。
template<MyType X>
using my_type_tag_t=std::integral_constant<MyType, X>;
template<MyType X>
constexpr my_type_tag_t<X> my_type_tag = {};
template<class T>struct tag_t{using type=T;};
template<class Tag>using type=typename Tag::type;
template<MyType>
struct my_type_map;
template<>
struct my_type_map<MyType::A>:tag<Foo>{};
template<>
struct my_type_map<MyType::B>:tag<Cat>{};
然后:
template<MyType X>
std::shared_ptr<type<my_type_map<X>>>
process( my_type_tag_t<X> );
您可以致电process( my_type_tag<A> )
来获取shared_ptr<Foo>
。
实施看起来像:
template<>
std::shared_ptr<Foo>
process( my_type_tag_t<MyType::A> ) {
// blah
}
仍然不优雅,可能无法解决您的问题,但它与您描述的解决方案非常接近。