как «пропустить» один параметр метода со значением по умолчанию, позволяя ему использовать значение по умолчанию, но изменять параметры после него

скажем, у нас есть такая функция (вымышленная):

function1(int Z, int X, bool Y=true, int Count=10, int ID=1,bool TeaTime=false);

И я хочу запустить эту функцию, но я хочу изменить все параметры, кроме "Count", и я хочу, чтобы она продолжала использовать значение по умолчанию.

Отказ от ответственности в этом выдуманном случае и в реальном случае, где я столкнулся с этим, я нашел значение по умолчанию в заголовочном файле и вручную закодировал его. но я не хочу этого, по крайней мере, не полагаться на него, например, если значение по умолчанию изменения в библиотеке, то в моем коде все равно будет вынуждено использовать это старое значение. также для простоты использования и снижения вероятности возникновения проблем/ошибок.

Что я пробовал: Я уже пробовал NULL и DEFAULT, оба они на самом деле позволяют моему коду работать отлично, но я сделал тестовую функцию, которая имела такие значения по умолчанию, и напечатал переменные в последовательный вывод, и я обнаружил, что использование NULL фактически перезаписывает его до 0 и DEFAULT перезаписывает его на 1.

Я также пробовал кое-что, например, оставить один пустым и тому подобное, но это приводило к ошибкам компиляции.

короче:

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

, 👍0

Обсуждение

Нет, вы должны определить все до последнего значения, отличного от значения по умолчанию, которое вы передаете. Все после получает значения по умолчанию. Вы можете создавать перегруженные функции или передавать структуру., @KIIV

ваш вопрос относится к https://stackoverflow.com/questions... это общий вопрос программирования, @jsotola


1 ответ


Лучший ответ:

2

Наиболее интуитивно понятным будет шаблон построителя с "цепочкой" способность (=возвращение ссылки на себя)

Что-то вроде (компьютерная версия, в ардуино убрать main, iostream и cout):

#include <iostream>

struct SomeParams {
    int        X;
    int        Z;
    bool       Y = true;
    int    count = 10;
    int       ID = 1;
    bool teaTime = false;

    SomeParams(int x, int z) : X{x}, Z{z} {};

    SomeParams & noY() { Y=false; return *this; }
    SomeParams & setCount(int c) { count = c; return *this; }
    SomeParams & setId(int i) { ID = i; return *this; }
    SomeParams & yesTeaTime() { teaTime = true; return *this; }
};

void function(SomeParams const & p) {
    std::cout << "X: " << p.X
              << " Y: " << p.Y 
              << " Z: " << p.Z 
              << " ID: " << p.ID 
              << " count: " << p.count 
              << " teaTime: " << p.teaTime 
              << "\n";
}

int main() {
    function(SomeParams{45,68}.yesTeaTime().setId(154758).noY());

    // без цепочки:
    auto params = SomeParams{4457,5468};
    params.setCount(4515);
    params.setId(15);
    function(params);
}
,

Ах, я понимаю, что вы имеете в виду, это действительно сработает. потребовалось некоторое время, чтобы посмотреть, как это работает, так как в последнее время я не так много кодировал, а затем индексы имеют тенденцию смешиваться между языками в памяти. но это кажется очень полезным и забавным для создания более динамичных вещей. однако в моем случае проблема в основном заключалась в том, что в некоторых обычных библиотеках у них было такое замечание (только что проверил, есть ли оно), поэтому вместо того, чтобы создавать лучшие функции, я изначально искал лучшее использование существующих., @TeD van Loon

до сих пор я счастлив, так как я приехал, чтобы узнать/вдохновиться чем-то новым, и получил это сейчас, узнав что-то хорошее и интересное (я думаю, что я даже искал что-то подобное несколько лет назад), @TeD van Loon

Добавлен другой способ без цепочки (если у вас есть эти сеттеры без возврата ссылки на себя, например: void noY() { Y=false; }), @KIIV