Конструирование со ссылкой на массив константных структур - PullRequest
1 голос
/ 10 июля 2020

Итак, у меня есть массив структур и класс, который использует этот массив. Конструктор должен ссылаться на массив структур, которые являются константами. Я борюсь с передачей массива структур в качестве ссылки, чтобы конструктор класса мог его использовать. Поскольку массив структур не меняется, нет необходимости его копировать, мне просто нужно сослаться на него. Вот мой текущий код, который генерирует ошибки.

struct c_cs_pair_t
{
    const wchar_t c;
    const wchar_t* cs;
};


class Converter
{
protected:
    size_t  _length;
    const c_cs_pair_t(& _pairs)[];

public:

    Converter ( const c_cs_pair_t(& pairs)[] ) : _pairs(pairs) {
        _length = sizeof ( pairs ) / sizeof( c_cs_pair_t );
    }

};

const c_cs_pair_t c2cspairs[] = 
        { { L'\n', L"\\n" }
        , { L'\0', L"\\0" }
        , { L'\\', L"\\\\" }
        , { L'[', L"\\[" }
        , { L']', L"\\]" }
        , { L'.', L"\\." }
        , { L':', L"\\:" }
        , { L'\u0008', L"\\b" }
        , { L'\u000c', L"\\f" }
        , { L'\u000a', L"\\n" }
        , { L'\u000d', L"\\r" }
        , { L'\u0009', L"\\t" }
        , { L'\u000b', L"\\v" }
        , { L'\u0000', L"\\0" }
        };

const Converter converter ( c2cspairs );

Когда я компилирую, я получаю ошибки компиляции, жалуясь на отсутствие подходящего кандидата.

Как передать массив конструктору, чтобы класс методы могут использовать это. Массив знает свой размер неявно, так как он является константой.

1 Ответ

5 голосов
/ 10 июля 2020

Вам необходимо указать размер массива с помощью параметра шаблона:

template<size_t N>
class Converter
{
protected:
    size_t  _length;
    const c_cs_pair_t(& _pairs)[N];

public:
    Converter ( const c_cs_pair_t(& pairs)[N] ) : _pairs(pairs) {
        _length = N;
    }
};

Обратите внимание, что вам больше не нужен член _length.

Вот демо . Обратите внимание, что это работает только с C ++ 17 с введением вывода аргументов шаблона класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...