2

我有一个问题(这也在标题中):在 C++ 中是否可以创建类似的通用函数read<type>()

我已经尝试过:

template <typename T>
T read() {
    T res;

    if (typeid(T) == typeid(int))
    {
        // some stuff
    }
    else if (/*some other type check*/) {} // etc.
}

当我试图编译这个时,它抛出了:Invalid conversion from **** to ****。我知道它为什么会抛出这样的异常,但是可以在 C++ 中做到这一点吗?

谢谢

4

2 回答 2

6

你可以实现这样的目标。最简单的方法可能是使用显式特化:

template <typename T>
T read() {
    T res;

    // etc.
}

template <>
int read<int>() {
    int res;

    // your special int code
}

根据您想要执行的操作,您可能需要改用标签调度

请注意,仅当您可以为默认的“未知 T”情况提出合理的行为时,您才应该这样做。如果您只希望用户在您预定义的特殊值的情况下选择一个,T那么您应该只使用单独的函数而不是在这里使用模板。

于 2013-08-04T22:06:51.530 回答
2

使用模板可以进行元编程并将实际类型抽象为泛型类型 T,也可以

  • 重载模板,因此类型推导系统将选择重载版本而不是“通用”版本
  • 在验证某些条件时使用 SFINAE 技术来选择给定的实现
  • 断言
  • 在 C++11 环境中也可以使用type_traits

请记住,模板在这里是为了利用您为您使用的每种类型的给定函数编写相同的实现,这是一个编译时功能,在编译模板被转换为函数之后。如果您需要根据输入的类型指定给定的行为,您可能对 SFINAE、type_traits 或其他类似解决方案感兴趣。

您还可以对“数量”、数字进行模板化,例如,您可以将int.

请注意,模板不会对类型强加特定的“过滤器”,例如检查函数执行的签名,您可以将任何类型或类扔给模板,这是您需要的模板的一个缺点几乎每次使用模板时都要处理。

于 2013-08-04T22:16:26.100 回答