在不同类型的样本类型之间转换
Convert between different kind of sample type
我想使用一个模板在不同的样本类型之间转换
template<class T,class U>
void convert(const T* source, U* dest, size_t n)
{
do
{
double G=double(max(*dest))/max(*source);
T diff=max(*source) - min(*source);
*dest=U(makeUnsigned(*source - min(*source))*G/makeUnsigned(diff)
+makeUnsigned(max(*source) - *source)*double(min(*dest))/makeUnsigned(diff));
++dest;
++source;
--n;
}
while(n!=0);
}
现在,我想要一个自动生成的矩阵,这样我就可以
convert[from][to](source,dest,n);
其中每个元素引用正确的版本。我知道我必须在这里强制转换函数指针(每个元素都需要是指向采用const void*、void*size_t的函数的指针,这无论如何都是等价的(。
我能做到吗?
首先,编写以下内容:
template<typename T, typename U>
U convert( T const& src );
因为其他一切都应该用模板元编程来编写。这样做的好处是,如果需要,你可以专门化你的convert<int, double>
和convert<std::string, int>
接下来,写下:
template<typename T, typename U>
void convert_buffer( T const* src, U* dest, size_t n );
其在循环中简单地调用上面的CCD_ 3。我将其分为两个函数,因为可能不统一的代码在convert
中,并且调用主体可见的函数基本上没有开销。
然后写下:
typedef void(*blind_converter)(void const*, void*, size_t);
template<typename T, typename U>
void convert_blind_buffer( void const* src, void* dest, size_t n ) {
return convert_buffer( reinterpret_cast<T const*>(src), reinterpret_cast<U*>(dest), n );
}
它封装了强制转换,并且不需要进行理论上无效的指针类型强制转换。它是"转换盲"缓冲区——盲,因为它需要void*
秒。
接下来,我们不想手动维护您的NxN阵列。用于存储您订购的类型列表的类型:
template<typename... Ts>
struct type_list {};
然后我们编写一些元程序来构建NxN数组:
template<typename Src, typename DestList>
struct make_convert_one_way;
template<typename Src, typename... Ds>
struct make_convert_one_way< Src, type_list<Ds...> > {
std::array< blind_converter, sizeof...(Ds) > operator()() const {
return { convert_blind_buffer< Src, Ds >... };
}
};
template<typename list>
struct make_convert_array;
template<typename... Ts>
struct make_convert_array< type_list<Ts...> > {
std::array< std::array<blind_converter, sizeof...(Ts) >, sizeof...(Ts) > operator()() const {
return { make_convert_one_way< Ts, type_list<Ts...> >... };
}
};
typedef type_list< int, char, double > my_list;
auto convert_array = make_convert_array<my_list>()();
或者类似的东西。
如果您的源和dest类型不一致,则必须修改以上内容以使用两个type_list
,但这并没有什么根本的困难
下一个有用的东西是能够从类型映射到上面数组中的索引,因为维护这应该是编译器的工作。
template<typename T, typename List, typename=void>
struct index_of;
template<typename T, typename T0, typename... Ts>
struct index_of<T, type_list<T0, Ts...>, typename std::enable_if<
std::is_same<T, T0>::value
>::type >: std::integral_constant< std::size_t, 0 > {};
template<typename T, typename T0, typename... Ts>
struct index_of<T, type_list<T0, Ts...>, typename std::enable_if<
!std::is_same<T, T0>::value
>::type >: std::integral_constant< std::size_t, index_of<T, type_list<Ts...>::value+1 > {};
它可以让你做到这一点:
static_assert( index_of< int, my_list >::value == 0, "all is well!" );
现在,你可能想把它裹在某种类型的敷料里。一种策略可能是这样的:
template<typename List>
struct EnumDressing;
template<typename... Ts>
struct EnumDressing<type_list<Ts...>> {
enum type {
e_begin = 0,
e_end = sizeof...(Ts),
};
template<typename T>
static constexpr type value() {
return static_cast<type>( index_of<T, type_list<Ts...> >::value );
}
};
其中,我们将EnumDressing<my_list>::type
作为代表类型的整数名称的enum
的类型,其值可以通过EnumDressing<my_list>::value<int>()
获得。很自然,你可以用typedef
s:来清理它
typedef EnumDressing<my_list> Types;
typedef Types::type eType;
struct typed_array {
eType type;
void* buff;
size_t n;
};
void do_convert( typed_array src, typed_array dst) {
Assert(src.n == dst.n);
convert_array[ src.type ][ dst.type ]( src.buff, dst.buff, std::min( src.n, dst.n ) );
}
template<typename T, size_t N>
typed_array make_typed_array( T (&arr)[N] ) {
return { Types::value<T>(), reinterpret_cast<void*>( &arr[0] ), N };
}
int main() {
double d[100];
int i[100];
do_convert( make_typed_array( d ), make_typed_array( i ) );
}
其中自然的实际用例将CCD_ 11的创建与其使用分离。
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 非类类型表达式的静态类型与动态类型之间的差异
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 在 Rcpp 中的字符串类型之间转换时出错
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 您可以在具有相同表示形式的类型之间reinterpret_cast吗?
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 包括数据类型之间的斗争
- 在不同类型之间转换常量指针
- 不同指针类型之间的无效比较:'type*' 和 'type&(*)()'
- 为什么 int 对象和函数类型之间不明确?
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- 如何在任何两种类型之间reinterpret_cast
- 根据编译时条件在类型之间选择类型的惯用方法
- memcpy是否可以保留不同类型之间的数据
- 显式允许在主类型和用户定义类型之间进行类型转换
- 使用std::filesystem::path在分隔符类型之间进行转换
- 在函数指针类型之间转换