在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环境中也可以使用
请记住,模板是用来帮助您在编译模板转换为函数后,为所使用的每种类型的给定函数编写相同的实现的,这是一种编译时功能。 如果您需要根据输入中获得的类型指定给定的行为,您可能对SFINAE、type_traits或其他类似解决方案感兴趣

您还可以模板化“数量”,例如,您可以模板化
int


请注意,模板不会像检查函数执行的签名那样对类型施加特定的“过滤器”,您可以直接向模板抛出任何类型或类,这是几乎每次使用模板时都需要处理的模板的一个缺点。

感谢您解释了
读取
功能的作用!您的问题可能在代码中未发布的部分。请记住,ifs的所有分支都将针对所有类型进行编译,并且只在以后进行优化。您可能希望为每种类型定义多个唯一的函数。所以你需要
template-double-read(){…}
等等。。。很抱歉它正在做一些具体的事情。例如string.reserve()或vector method push_back()等。因此编译器无法编译它。重载在这里没有帮助,因为函数没有参数。这是一个关于如何在编译时做出决定的好的概述,但我认为它对OP的具体场景并不适用。@ ByyyOnali我从假设你不能真正在C++中制作100%个通用模板开始,在某些时候你必须在大多数时间内做出决定。即使在经典的斐波那契例子中,你也有至少1个重载模板。C++中有很多真正的通用模板。考虑<代码> STD::UngQuyPPTR <代码>或<代码> STD::SysDypPTR 或<代码> STD::列表或 STD::MAP等。当然元编程需要专门化,但不是每个人都需要做元编程。