c++ - 如何使用 RTTI 确定代码的行为

标签 c++ stl rtti

我有一段代码使用 RTTI 作为大小写选择器

#include <iostream>
#include <vector>
#include <typeinfo>
#include <complex>
#include <algorithm>

using namespace std;

typedef complex<int> data;
typedef std::vector< data > List;

template <typename T> void zeros(T &v)
{
  if (typeid(typename T::value_type)==typeid(complex<int>))
    std::fill(v.begin(), v.end(), complex<int>(0, 0));
  else std::fill(v.begin(), v.end(), static_cast<typename T::value_type>(0));
}

int main(int argc, char *argv[])
{
  List A;

  zeros(A);
  return 0;
}

在上面的代码中,我使用 typename T::value_type 来确定列表的数据类型,如果有复数那么我将用复数零填充列表。否则,将其设为相应类型的零。在上面的代码中,如果我将数据设置为 int,它编译和运行没有任何问题。但是如果我将它设置为另一种类型,它就无法编译。我想知道是否有任何方法可以使上述代码适用于不同类型的数据(对于 float、double、long、int、complex、complex 和 complex)。

附注我想在两种情况下填充 vector 的原因是因为出于某种原因我要创建自己的复数,我必须告诉代码如何创建复数零或实数零。但是为了测试,我什至不能让它与内置数据类型一起工作

最佳答案

您似乎需要一个默认的初始化复数 (0, 0) 和一个零初始化的 int。您可以使用值初始化来实现此目的:

template <typename T> void zeros(T &v)
{
    std::fill(v.begin(), v.end(), typename T::value_type{});
}

如果你真的想根据什么是 T::value_type 执行一些分支,那么最好使用一些类型特征,如下所示:

template<typename T>
struct default_value {
    static const T value;
};

template<>
struct default_value<std::complex<int>> { // assuming you'll use other complex type
    static const std::complex<int> value;
};

template<typename T>
const T default_value<T>::value = T{};
const std::complex<int> default_value<std::complex<int>>::value = std::complex<int>(0, 0);

// now use it
template <typename T> void zeros(T &v)
{
    std::fill(v.begin(), v.end(), default_value<typename T::value_type>::value);
}

但是,内置类型的默认构造和值初始化应该足够了。

关于c++ - 如何使用 RTTI 确定代码的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18413978/

相关文章:

c++ - 是否有 high_resolution_clock 不是 typedef 的标准库实现?

c++ - C++ POD 类型是否具有 RTTI?

用于通用记录的 Delphi TypeInfo

C++ std::vector::const_iterator 问题

c++ - 是否可以跨 RTLD_LOCAL 加载的库合并 vtables/typeinfo 等弱符号?

c++ - 为什么 std::future 和 std::promise 不是最终的?

c++ - 从 sfml 显示文本的问题

c++ - 合并排序算法错误

c++ - 可能传递给构造函数的不同类

c++ - STL/boost 方法为 vector 中的每个对象重复间接调用方法