小编hli*_*ide的帖子

从一个巨大的枚举,我尝试通过使用一些模板技巧,使一个函数应用正确的操作,而无需使用开关体

我有一个包含1223个元素的枚举类型.我有一个1222个案例的函数和一个交换块中的默认案例.如果我想修改枚举类型中的一些元素,我还需要修改该函数.更糟糕的是,我可能有一个具有大开关块的多个功能.所以我试图通过大量的函数来解决它,每个函数根据元素应用正确的动作.因为我也希望进行最小的更改,我希望隐式完成函数指针赋值,所以我使用模板技巧让1223个元素的数组被视为1223个连续的1个元素的子数组的列表来执行通过每个元素的构造函数分配隐式函数指针.

宏是禁止的.包括Boost在内的外部库也是被禁止的.

这里有一个简化的代码(如果I_LAST_INSTRUCTION值低得多,可编译和可运行):

#include <iostream>
#include <vector>

using namespace std;

typedef size_t Instr; // dummy one for simplified code

enum
{
    I_INVALID = 0,

    I_LAST_INSTRUCTION = 1223
};

template< size_t id >
static void Test$(std::vector< Instr > &, bool)
{
    cout << "testing instruction #" << id << endl;
}

template< typename Derived, size_t start_id, size_t end_id >
struct Tester$ : Tester$ < Derived, start_id, end_id - 1 >
{
    Tester$()
    {
        static_cast<Derived *>(this)->array[end_id …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

4
推荐指数
1
解决办法
227
查看次数

有没有办法让模板函数应用于C++中任何长度的数组?

我有一种情况,我需要读取一个文本文件,并检查助记符是否有效,所以我有一组动态的助记符(现在1226!),我可以在必要时稍后更改.所以我首先尝试这种方式:

enum InstrID
{
    I_INVALID = 0,

    I_AAA,
    I_AAD,
    ...
};

static char const * nameOfinstrID[] =
{
    "???",

    "AAA",
    "AAD",
    ...
};


struct InstrIDIterator
{
    template< int N > static InstrIDIterator Make(char const * begin[N], size_t index = N)
    {
        InstrIDIterator result;
        result.index = index;
        result.begin = begin;
        return result;
    }

    std::map< std::string, InstrID >::value_type operator * () { return std::map< std::string, InstrID >::value_type(begin[index], InstrID(index)); }

    ... // iterator-like stuff

    size_t index;
    char const ** begin;
};

InstrID getInstrID(std::string …
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates

3
推荐指数
1
解决办法
119
查看次数

标签 统计

c++ ×2

templates ×2

arrays ×1

c++11 ×1