2016-06-03 4 views
0

я вспомнил теперь, когда я видел что-то подобное в C:вперед использование параметра функции

void foo(int bar; char baz[bar]) { ... } 

Я не помню его имя или допустимый синтаксис, и я удивляюсь, если он доступен в C++ тоже?

+1

nope это невозможно. – bolov

+1

Я не думаю, что ';' является допустимым синтаксисом – user463035818

+2

Это недопустимый код C или C++ – NathanOliver

ответ

3

Нет, это невозможно в соответствии со стандартом, поскольку вы динамически передаете размер массива функции, если только не существует специального расширения компилятора, которое мне не хватает.

Что вы можете сделать, это указать его в качестве аргумента шаблона и пусть вычет делать свою работу, например:

template<size_t size> 
void foo (char (&a)[size]) 
{ 
    for (size_t i = 0; i < size; ++i) 
    cout << a[i] << endl; 
} 

int main() 
{ 
    char a[] = {'a','b','c','d','e'}; 
    foo(a); 
    return 0; 
} 

Или, так как вы работаете с C++, используйте std::array или std::vector и итераторы.

+0

О, я даже не знал, что есть также функции шаблонов. Спасибо, я приму ваш ответ как можно скорее. –

2

Для начала char baz[10] при использовании в качестве параметра объявляет указатель, а не массив, поэтому 10 полностью игнорируется. Это называется распадом массива на указатель, и это неудачное наследование от C.

Учитывая, что вы не запрашивали строго о размере массива и расширяли свой вопрос до использования предыдущего параметра, аргументом по умолчанию являлись бы аргументы по умолчанию. Например.

void foo(int a, int b = a); 

И вот ответ снова нет, это недействительно.

См. Этот ответ: https://stackoverflow.com/a/1880877/2805305 для стандартного обоснования.

0

На самом деле существует «Прямое использование параметра функции» на C++, но не то, о чем вы говорите.

Поскольку C++ 11, вы можете делать такие вещи, как это вывести тип параметров (или тип возвращаемого значения) с использованием предыдущего параметра:

template <typename T> 
auto get (T const& t, size_t i) -> decltype(t[i]) { } 

Или:

template <typename T> 
void set (T &t, size_t i, decltype(t[i]) const& v) { } 

Может быть, я полностью но, поскольку вы точно не помнили, что видели, я подумал, что это может быть так.

Смежные вопросы