我正在撰寫一個資料處理器,并且希望能夠執行真實到真實和真實到復雜的計算。我現在的設定:
// class to hold various data types
template <typename T>
class DataArray
{
public:
DataArray(){};
T *ptr;
};
// Processing configuration
template <typename T>
class Config
{
public:
Config(){};
T var;
};
// The data processor itself, takes input, output array and the processing configuration
template <typename Tin, typename Tout>
class Process
{
public:
DataArray<Tin> *in;
DataArray<Tout> *out;
Config<Tout> *config;
Process(){};
Process(DataArray<Tin> *in_, DataArray<Tout> *out_, Config<Tout> *config_)
{
in = in_;
out = out_;
config = config_;
}
};
目前,我可以按如下方式處理實對實處理:
int main()
{
DataArray<int16_t> input;
DataArray<float> output;
Config<float> config;
// real 2 real processing
Process<int16_t, float> P1(&input, &output, &config); // works fine
return 0;
}
我面臨的問題是,當我想做從實到復雜的處理時,我仍然需要Config在std::complex<T>. 如何更改Process類(或任何其他類),以便我可以創建一個Process<int16_t, std::complex<float>>知道它需要 a 的類Config<float>?
int main()
{
DataArray<int16_t> input;
DataArray<std::complex<float>> output_complex;
Config<float> config;
// real 2 complex processing
Process<int16_t, std::complex<float>> P2(&input, &output, &config); // Obviously does not work
return 0;
}
后續問題
感謝 Remy 的回答,我現在可以在 class 中獲取 std::complex 的型別Process。如果我有一個帶有模板函式的命名空間,我將如何獲得該函式/命名空間中的基礎型別?以下作業,但感覺有點笨拙。這意味著我必須using T = typename helper::value_type_of<Tout>::type;在每個內核中重復該行,對嗎?
// namespace with computation kernels
namespace kernels
{
// define ConfigType in the kernel namespace?
template <typename T>
using ConfigType = Config<typename helper::value_type_of<T>::type>;
template <typename Tin, typename Tout, bool IQ>
void bfpw(ConfigType<Tout> *BFC, Tin *RF, Tout *BF)
{
// get type of Tout: std::complex<float> or float
using T = typename helper::value_type_of<Tout>::type;
T variable = BFC->var;
}
}
template <typename Tin, typename Tout>
Process<Tin, Tout>::Process(DataArray<Tin> *in_, DataArray<Tout> *out_, ConfigType *config_)
{
in = in_;
out = out_;
config = config_;
kernels::bfpw<Tin, Tout, true>(config, in->ptr, out->ptr); // call the kernel
}
uj5u.com熱心網友回復:
一種方法是定義一個輔助模板,它Process可以用來檢測是否Tout是 a std::complex,如果是,那么它可以使用Tout'svalue_type成員,否則它可以Tout按原樣使用。
例如:
namespace helper {
template<typename T>
struct value_type_of {
using type = T;
};
template<typename T>
struct value_type_of<std::complex<T>> {
using type = typename std::complex<T>::value_type;
// or simply: using type = T;
};
}
template <typename Tin, typename Tout>
class Process
{
public:
using ConfigType = Config<typename helper::value_type_of<Tout>::type>;
...
ConfigType *config;
Process(){};
Process(..., ConfigType *config_)
{
...
config = config_;
}
};
在線演示
這樣,Process<..., float>雙方Process<..., std::complex<float>>都會接受Config<float>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478096.html
