#include <iostream>
#include <cstdint>
#include <complex>
// 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;
};
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;
};
}
// The data processor itself, takes input, output array and the processing configuration
template <typename Tin, typename Tout>
class Process
{
public:
using ConfigType = Config<typename helper::value_type_of<Tout>::type>;
DataArray<Tin> *in;
DataArray<Tout> *out;
ConfigType *config;
Process(){};
Process(DataArray<Tin> *in_, DataArray<Tout> *out_, ConfigType *config_)
{
in = in_;
out = out_;
config = config_;
}
};
void Real2Real()
{
DataArray<int16_t> input;
DataArray<float> output;
Config<float> config;
// real 2 real processing
Process<int16_t, float> P1(&input, &output, &config); // works fine
}
void Real2Complex()
{
DataArray<int16_t> input;
DataArray<std::complex<float>> output;
Config<float> config;
// real 2 complex processing
Process<int16_t, std::complex<float>> P2(&input, &output, &config); // Obviously does not work
}
int main() {
Real2Real();
Real2Complex();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPGNvbXBsZXg+CgovLyBjbGFzcyB0byBob2xkIHZhcmlvdXMgZGF0YSB0eXBlcwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgRGF0YUFycmF5CnsKcHVibGljOgogICAgRGF0YUFycmF5KCl7fTsKICAgIFQgKnB0cjsKfTsKCi8vIFByb2Nlc3NpbmcgY29uZmlndXJhdGlvbiAKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIENvbmZpZwp7CnB1YmxpYzoKICAgIENvbmZpZygpe307CiAgICBUIHZhcjsKfTsKCm5hbWVzcGFjZSBoZWxwZXIgewoKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CglzdHJ1Y3QgdmFsdWVfdHlwZV9vZiB7CgkJdXNpbmcgdHlwZSA9IFQ7Cgl9OwoKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CglzdHJ1Y3QgdmFsdWVfdHlwZV9vZjxzdGQ6OmNvbXBsZXg8VD4+IHsKCQl1c2luZyB0eXBlID0gdHlwZW5hbWUgc3RkOjpjb21wbGV4PFQ+Ojp2YWx1ZV90eXBlOwoJCS8vb3Igc2ltcGx5OiB1c2luZyB0eXBlID0gVDsKICAgIH07Cn0KCi8vIFRoZSBkYXRhIHByb2Nlc3NvciBpdHNlbGYsIHRha2VzIGlucHV0LCBvdXRwdXQgYXJyYXkgYW5kIHRoZSBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24KdGVtcGxhdGUgPHR5cGVuYW1lIFRpbiwgdHlwZW5hbWUgVG91dD4KY2xhc3MgUHJvY2Vzcwp7CnB1YmxpYzoKICAgIHVzaW5nIENvbmZpZ1R5cGUgPSBDb25maWc8dHlwZW5hbWUgaGVscGVyOjp2YWx1ZV90eXBlX29mPFRvdXQ+Ojp0eXBlPjsKCiAgICBEYXRhQXJyYXk8VGluPiAqaW47CiAgICBEYXRhQXJyYXk8VG91dD4gKm91dDsKICAgIENvbmZpZ1R5cGUgKmNvbmZpZzsKCiAgICBQcm9jZXNzKCl7fTsKICAgIFByb2Nlc3MoRGF0YUFycmF5PFRpbj4gKmluXywgRGF0YUFycmF5PFRvdXQ+ICpvdXRfLCBDb25maWdUeXBlICpjb25maWdfKQogICAgewogICAgICAgIGluID0gaW5fOwogICAgICAgIG91dCA9IG91dF87CiAgICAgICAgY29uZmlnID0gY29uZmlnXzsKICAgIH0KfTsKCnZvaWQgUmVhbDJSZWFsKCkKewogICAgRGF0YUFycmF5PGludDE2X3Q+IGlucHV0OwogICAgRGF0YUFycmF5PGZsb2F0PiBvdXRwdXQ7CiAgICBDb25maWc8ZmxvYXQ+IGNvbmZpZzsKICAgIC8vIHJlYWwgMiByZWFsIHByb2Nlc3NpbmcKICAgIFByb2Nlc3M8aW50MTZfdCwgZmxvYXQ+IFAxKCZpbnB1dCwgJm91dHB1dCwgJmNvbmZpZyk7IC8vIHdvcmtzIGZpbmUgCn0KCnZvaWQgUmVhbDJDb21wbGV4KCkKewogICAgRGF0YUFycmF5PGludDE2X3Q+IGlucHV0OwogICAgRGF0YUFycmF5PHN0ZDo6Y29tcGxleDxmbG9hdD4+IG91dHB1dDsKICAgIENvbmZpZzxmbG9hdD4gY29uZmlnOwoKICAgIC8vIHJlYWwgMiBjb21wbGV4IHByb2Nlc3NpbmcKICAgIFByb2Nlc3M8aW50MTZfdCwgc3RkOjpjb21wbGV4PGZsb2F0Pj4gUDIoJmlucHV0LCAmb3V0cHV0LCAmY29uZmlnKTsgLy8gT2J2aW91c2x5IGRvZXMgbm90IHdvcmsKfQoKaW50IG1haW4oKSB7CglSZWFsMlJlYWwoKTsKCVJlYWwyQ29tcGxleCgpOwoJcmV0dXJuIDA7Cn0=