C++ 使用boost mp11高效地打开运行时值(处理功能完成时中断)
我在下面实现了对运行时值的调度,以某种方式解释数据(在这个玩具示例中,数据可以是uint8_t或short) 代码似乎可以工作,但我想知道是否可以以某种方式对代码进行微优化,以便在命中(处理函数匹配)时停止处理(当前即使元组的第一个元素是“处理程序”,整个元组也会在运行时迭代)C++ 使用boost mp11高效地打开运行时值(处理功能完成时中断),c++,c++20,boost-mp11,C++,C++20,Boost Mp11,我在下面实现了对运行时值的调度,以某种方式解释数据(在这个玩具示例中,数据可以是uint8_t或short) 代码似乎可以工作,但我想知道是否可以以某种方式对代码进行微优化,以便在命中(处理函数匹配)时停止处理(当前即使元组的第一个元素是“处理程序”,整个元组也会在运行时迭代) #包括 #包括 uint8_t数据[4]={0,1100,2}; 模板 结构类型{ 静态constexpr int id=runtimeId; 使用类型=T; }; 常量自动打印=[](常量T*数据){ 如果conste
#包括
#包括
uint8_t数据[4]={0,1100,2};
模板
结构类型{
静态constexpr int id=runtimeId;
使用类型=T;
};
常量自动打印=[](常量T*数据){
如果constexpr(std::is_same_v){
常量短*值=(常量短*)数据;
std::cout此函数的运行时性能在很大程度上取决于元组的大小。您可以为每个元组制定自己的实现,在执行函数时提前执行:
template<typename FuncTuple, typename Selector>
void tuple_for_each(FuncTuple const& funcTuple, Selector selector)
{
std::apply([selector](auto const& ...funcs)
{
(void)(selector(funcs) || ...);
}, funcTuple);
}
模板
每个元素的无效元组(functtuple const和functtuple,选择器)
{
std::apply([selector](自动常量和函数)
{
(无效)(选择器(功能)| |……);
},函数组);
}
您的调度将如下所示:
void dispatch(int kind)
{
tuple_for_each(mappings, [kind]<typename Mapping>(const Mapping&)
{
std::cout << "loop, ";
if (Mapping::id == kind)
{
print((typename Mapping::type*)data);
return true;
}
return false;
});
}
void分派(int类)
{
每个(映射,[种类](常量映射&)的元组
{
std::cout关于UB:cause alignment requirements?@nosenseal因为数据
是一个字符数组,而不是一个短数组。你的C样式转换归结为一个重新解释(reinterpret)转换
,它只允许转换为一个T
类型的类型,如果源实际上持有一个T
类型的对象。公平地说,转换本身是不正确的t UB,但随后会取消对结果指针的引用。此外,您很可能不会遇到任何问题,因为您正在整数类型的指针之间进行强制转换,但严格来说,这仍然是UB。是的,我知道paper,我希望它会被接受。@nosenseal,用于C++20(嗯,)@nosensetal不,Timo就在这里-Mp11没有这样的东西。这里的解决方案非常简短:-)
void dispatch(int kind)
{
tuple_for_each(mappings, [kind]<typename Mapping>(const Mapping&)
{
std::cout << "loop, ";
if (Mapping::id == kind)
{
print((typename Mapping::type*)data);
return true;
}
return false;
});
}