C++ C++;使用类作为返回类型,枚举作为参数的模板专门化

C++ C++;使用类作为返回类型,枚举作为参数的模板专门化,c++,templates,c++11,C++,Templates,C++11,我没有很多使用模板的经验,但我正在尝试使用一个返回不同类的函数基于枚举进行模板专门化。下面是示例代码(或者更确切地说是我试图实现的): class-Foo{ //成员变量 }; 班猫{ //成员变量 }; 枚举MyType{A,B,C}; //头文件 模板std_shared_ptr process(); //cpp文件/实现 模板std_共享_ptr流程() { } 模板std_shared_ptr process(); { } 有人能帮我找出我在这里遗漏了什么或做错了什么吗?我尝试搜索它并

我没有很多使用模板的经验,但我正在尝试使用一个返回不同类的函数基于枚举进行模板专门化。下面是示例代码(或者更确切地说是我试图实现的):

class-Foo{
//成员变量
};
班猫{
//成员变量
};
枚举MyType{A,B,C};
//头文件
模板std_shared_ptr process();
//cpp文件/实现
模板std_共享_ptr流程()
{
}
模板std_shared_ptr process();
{
}
有人能帮我找出我在这里遗漏了什么或做错了什么吗?我尝试搜索它并找到了一些处理枚举类型()的解决方案,但是,我不知道如何将它与函数中的模板返回类型组合在一起

编辑: 我在这里尝试的是基于枚举类型作为函数的参数进行模板专门化。同样的函数也返回一个模板类。因此,函数在这里有两个模板:T(返回参数)和U(输入参数,它是一个枚举)。有可能吗

编辑:
为正确的行为修改了上述示例。

不能部分专门化模板函数

函数参数的值而不是类型不能更改返回值的类型。非类型模板参数的值可以更改返回值的类型,但返回值是在
中传递的,必须在编译时确定,而不是在
()

标签可能会有所帮助

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>{};
模板
使用my_type_tag_t=std::integral_常量;
模板
constexpr my_type_tag\t my_type_tag={};
templatestruct标记{使用type=t;};
templateusing type=typename标记::type;
模板
结构我的类型映射;
模板
结构my_type_map:tag{};
模板
结构my_type_map:tag{};
然后:

模板
std::共享的ptr
过程(我的类型标签);
在这里,您可以调用
进程(my_type_标记)
从中获取
共享的\u ptr

实现如下所示:

template<>
std::shared_ptr<Foo>
process( my_type_tag_t<MyType::A> ) {
  // blah
}
模板
std::共享的ptr
进程(我的类型标签){
//废话
}

仍然不雅观,可能无法解决您的问题,但它与您描述的解决方案非常接近。

看起来像。我不明白您要完成什么。例如,在模板中。。。过程(U输入)-U是一个值,而不是一个类型,那么U输入意味着什么?也许你们应该用文字解释你们想做什么。@Ami Tavory在编辑部分添加了更多细节。我对模板不太熟悉,所以可能问问题的方式不对。我能理解。为基于枚举的模板专门化修改了上面的示例,它也具有基于模板的返回类型。
template<MyType X>
std::shared_ptr<type<my_type_map<X>>>
process( my_type_tag_t<X> );
template<>
std::shared_ptr<Foo>
process( my_type_tag_t<MyType::A> ) {
  // blah
}