C++ 使用boost mp11高效地打开运行时值(处理功能完成时中断)

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或short)

代码似乎可以工作,但我想知道是否可以以某种方式对代码进行微优化,以便在命中(处理函数匹配)时停止处理(当前即使元组的第一个元素是“处理程序”,整个元组也会在运行时迭代)

#包括
#包括
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;
    });
}