Я использую std::vector<int>
для двух разных видов информации. Я хочу быть уверенным, что я не случайно смешиваю два использования.
Короче говоря, я хочу, чтобы что-то вроде этого фрагмента кода терпит неудачу:
#include <vector>
using A = std::vector<int>;
using B = std::vector<int>;
void fa(const A&);
void fb(const B&);
void fun()
{
A ax;
B bx;
fa(bx);
fb(ax);
}
Этот код компилируется, хотя fa
ожидает аргумент типа A
.
Очевидно, что A
и B
идентичны.
Каков самый простой способ правильно выполнить этот код:
fa(ax);
fb(bx);
и выполните этот код:
fa(bx);
fb(ax);
Конечно, я могу обернуть std::vector<int>
в другой класс, но тогда мне нужно будет переписать его интерфейс. В качестве альтернативы я мог бы наследовать от std::vector<int>
, но это часто обескураживается.
Короче говоря, мне нужны две несовместимые версии std::vector<int>
.
ИЗМЕНИТЬ
Было высказано предположение, что Сильные typedefs могут решить эту проблему. Это отчасти верно. Если я использую BOOST_STRONG_TYPEDEF(std::vector<int>, A)
, мне нужно добавить некоторые раздражающие роли. Например, вместо
A ax{1,3,5};
Мне нужно использовать
A ax{std::vector<int>{1,3,5}};
И вместо
for (auto x : ax) ...
Мне нужно использовать
for (auto x : (std::vector<int>)ax) ...