簡體   English   中英

如何使用RTTI確定代碼的行為

[英]How to use RTTI to determine the behavior of code

我有一段代碼將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;
}

在上面的代碼中,我使用類型名T :: value_type來確定列表的數據類型,如果存在復數,那么我將用復數零填充列表。 否則,將其設為對應類型的零。 在上面的代碼中,如果我將數據設置為int,則它確實可以編譯並運行而沒有任何問題。 但是,如果我將其設置為其他類型,則無法編譯。 我想知道是否有任何方法可以使上述代碼適用於不同類型的數據(對於float,double,long,int,complex,complex和complex)。

ps我想在兩種情況下填充向量的原因,因為由於某種原因我將創建自己的復數,並且我必須告訴代碼如何創建復數零或實零。 但是對於測試,我什至無法使其與內置數據類型一起使用

似乎您既想要默認的初始化復數(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);
}

但是同樣,內置類型的默認構造和值初始化應該足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM