Как проверить, является аргумент по умолчанию в шаблоне или нет?

Я хочу вызывать функцию без дополнительных аргументов, но мне нужно добавить проверку внутри функции, что бы узнать был добавлен аргумент по умолчанию или нет.

  template <class T1, class T2>
    void NumbVector(T1& int_numb = 1, T2& string_numb) {
    
        // проверку желательно сделать на уровне if
        if (?) {
            
            ...
        }
        ...
    }

сам вызов

NumbVector(10, 3);
NumbVector(1);

Ответы (1 шт):

Автор решения: KoVadim

Вот пример

// эта функция содержит всю логику
// можно сказать, что оно "приватная"
// n - это дополнительный парамер
template <class T1, class T2>
void NumbVector(T1& int_numb, T2& string_numb, int n) {

    if (n == 1) {
        // позвали функцию с одним параметром
    } else {
        // позвали функцию с двумя параметрами
    }

    
}

// это функция с двумя параметрами
template <class T1, class T2>
void NumbVector2(T1& int_numb, T2& NumbVector) {
    // 2 в параметре как раз и означает, что вызывается функция с двумя параметрами
    // но это условность. Можно прицепить bool, можно enum.
    NumbVector(int_numb, NumbVector, 2);
    
}
// а это - с одним
template <class T1, class T2>
void NumbVector1(T2& string_numb) {
    // а тут вот так пришлось, потому что параметр передается по ссылке.
    // может это ошибка, а может это так и задумано
    int x = 1;
    NumbVector(x, string_numb, 1);
    
}

потом можно пойти дальше и прикрутить std::forward, а может использовать variadic template. Но нужно ли это?

Возможно, Ваша задача сильно проще и есть более красивые решения.

→ Ссылка