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

hli*_*ide 3 c++ arrays templates

我有一种情况,我需要读取一个文本文件,并检查助记符是否有效,所以我有一组动态的助记符(现在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 const & name)
{
    static std::map< std::string, InstrID > instrID_map(InstrIDIterator::Make(nameOfinstrID, 0), InstrIDIterator::Make(nameOfinstrID));

    return instrID_map[name];
}

...
Run Code Online (Sandbox Code Playgroud)

但是我在MSVC 2013下遇到了这个错误:

错误C2784:'x86_text_grammar :: InstrIDIterator x86_text_grammar :: InstrIDIterator :: Make(const char*[N],size_t)':无法从'const char*[1225]'推断'const char*[N]'的模板参数

所以我的问题是:这只是关于MSVC 2013的问题吗?或者即使对于ISO C++ x11,这是正常的吗?

当然,在这种情况下,我可以继续使用一种不那么通用的编译方式(并且更好地检查字符串数组维度):

enum InstrID
{
    I_INVALID = 0,

    I_AAA,
    I_AAD,
    ...
    InstrID_max
};

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

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

struct InstrIDIterator
{
    static InstrIDIterator Make(char const * begin[InstrID_max], size_t index = InstrID_max)
    {
        InstrIDIterator result;
        result.index = index;
        result.begin = begin;
        return result;
    }

    ...
};
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 8

T[N]调整表单的函数参数(也就是说,它实际上完全相同)T*.所以参数char const * begin[InstrID_max]是一样的char const** begin.

您可以使用对特定大小的数组的引用作为参数和语法T (&array_name)[ARRAY_LENGTH].这让你失望

template<size_t N>
static InstrIDIterator Make(const char* (&begin)[N],  size_t index = N);
Run Code Online (Sandbox Code Playgroud)