在C++;可能创建通用函数,如read<;类型>;()? 我有一个问题(标题也在这里):C++中可能创建的通用函数,如读())/代码>?
我已经试过了:在C++;可能创建通用函数,如read<;类型>;()? 我有一个问题(标题也在这里):C++中可能创建的通用函数,如读())/代码>?,c++,templates,C++,Templates,我已经试过了: template <typename T> T read() { T res; if (typeid(T) == typeid(int)) { // some stuff } else if (/*some other type check*/) {} // etc. } 模板 T read(){ T res; if(typeid(T)=typeid(int)) { //一些东西 } else if(/*其他
template <typename T>
T read() {
T res;
if (typeid(T) == typeid(int))
{
// some stuff
}
else if (/*some other type check*/) {} // etc.
}
模板
T read(){
T res;
if(typeid(T)=typeid(int))
{
//一些东西
}
else if(/*其他类型检查*/){}//等。
}
当我试图编译它时,它抛出:从****到****
的转换无效。我知道为什么它会像这样抛出异常,但是在C++中可以这样做吗?
谢谢你可以实现这样的目标。最简单的方法可能是使用显式专门化:
template <typename T>
T read() {
T res;
// etc.
}
template <>
int read<int>() {
int res;
// your special int code
}
模板
T read(){
T res;
//等等。
}
模板
int read(){
国际关系;
//你的特殊整数代码
}
根据您想要做的事情,您可能需要使用
请注意,只有当您能够为默认的“未知T”情况提出合理的行为时,才应该这样做。如果您只希望用户在预定义的特殊值
T
中选择一个,那么您应该只使用单独的函数,而不在此处使用模板。使用模板可以进行元编程,并将实际类型抽象为泛型类型T,也可以
- 重载模板,以便类型推断系统将选择重载版本而不是“泛型”版本
- 在验证某些条件时,使用SFINAE技术选择给定的实现
- 在C++11环境中也可以使用
int
请注意,模板不会像检查函数执行的签名那样对类型施加特定的“过滤器”,您可以直接向模板抛出任何类型或类,这是几乎每次使用模板时都需要处理的模板的一个缺点。感谢您解释了
读取
功能的作用!您的问题可能在代码中未发布的部分。请记住,ifs的所有分支都将针对所有类型进行编译,并且只在以后进行优化。您可能希望为每种类型定义多个唯一的函数。所以你需要template-double-read(){…}
等等。。。很抱歉它正在做一些具体的事情。例如string.reserve()或vector method push_back()等。因此编译器无法编译它。重载在这里没有帮助,因为函数没有参数。这是一个关于如何在编译时做出决定的好的概述,但我认为它对OP的具体场景并不适用。@ ByyyOnali我从假设你不能真正在C++中制作100%个通用模板开始,在某些时候你必须在大多数时间内做出决定。即使在经典的斐波那契例子中,你也有至少1个重载模板。C++中有很多真正的通用模板。考虑<代码> STD::UngQuyPPTR <代码>或<代码> STD::SysDypPTR 或<代码> STD::列表或