Расширенные списки инициализаторов и массивы

У меня есть простая функция, такая как:

void fun(vector<int> vec)
{
//...
}

void fun(int* smth)
{
//...
}

Нет, когда я пишу в своей программе.

fun({2,3});

Это вызывает у меня веселье с аргументом vector. Я знаю, что он находится в новых C ++ расширенных списках инициализаторов, но я хотел бы использовать новый C ++ и сказать компилятору, что это всего лишь массив int, как я могу это сделать?

РЕДАКТИРОВАТЬ:

Было бы неплохо сделать это в 1 строку 🙂

5

Решение

Вы не можете инициализировать указатель с массивом, потому что указатель не является массивом (несмотря на появление в немного ситуации, что это происходит, это не так).

Вам нужно будет передать указатель на существующий массив. В качестве альтернативы используйте vector перегрузка — конечно, вы предпочитаете этот в любом случае ?! И если две функции делают разные вещи, то почему они перегружают друг друга (т.е. почему это имеет значение)?

8

Другие решения

Сделайте шаблон псевдонима

template<typename T>
using identity = T;

Так что вы можете написать

fun(identity<int[]>{1,2});

Это не очень хорошее программирование, потому что в вашей функции у вас нет возможности узнать размер массива, на который указывает. Это должно быть явно передано функции, если предполагается, что функция работает со списком элементов. Если вы хотите обрабатывать массивы, попробуйте использовать что-то вроде llvm::ArrayRef<T> или создайте свой собственный

struct array_ref {
public:
template<int N>
array_ref(const identity<int[N]> &n)
:begin_(n), end_(n + N)
{ }

array_ref(const std::vector<int>& n)
:begin_(n.data()), end_(n.data() + n.size())
{ }

public:
int const *begin() const { return begin_; }
int const *end() const { return end_; }
int size() const { return end_ - begin_; }

private:
int const *begin_;
int const *end_;
};

void fun(array_ref array) {
...
}

int main() {
fun(array_ref(identity<int[]>{1,2}));
}
6

По вопросам рекламы [email protected]