Проверка типа () проходных параметров шаблонной функции - PullRequest
1 голос
/ 12 апреля 2020

Я не хочу использовать перегрузку функции для небольшого изменения функции. Вместо этого я хочу использовать проверку typeid () передачи параметра шаблонной функции ниже. Но, если я не закомментирую строку в коде ниже, это даст ошибку компиляции:

Severity    Code    Description Project File    Line    Suppression State
Error       invalid operands to binary expression ('basic_ostream<char, std::char_traits<char> >' and 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >')

Как я понимаю, компилятор не знает, как себя вести. Есть ли решение для этого?

Код:

#include <iostream>
#include <vector>

using namespace std;


template <class T>
void Test(T A)
{
    if (typeid(T) == typeid(vector<string>)) {
        cout << "The type of A is vector<string>" << endl << endl;
        //cout << "First element of A is:" << A[0] << endl;    // If I don't comment out this line, it gives the compiler error.
    }

    if (typeid(T) == typeid(vector<vector<string>>)) {
        cout << "The type of A is vector<vector<string>>" << endl;
        cout << "First row first element of A is:" << A[0][0] << endl;
    }
}

int main()
{
    Test(vector<string> {"1", "2", "3"});

    Test(vector<vector<string>> { {"11", "12", "13"}, { "21", "22", "23" }});

    return 0;
}

1 Ответ

2 голосов
/ 12 апреля 2020

Проблема в обычном if, оператор-истина оператор-ложь , если присутствует) должен быть действительным оператором при компиляции время, независимо от того, что является результатом условия , для каждого экземпляра Test с данным типом T.

Вы можете использовать constexpr if начиная с C ++ 17 (с std::is_same).

В выражении constexpr if значение условие должно быть контекстно-преобразованным константным выражением типа bool. Если значение true, то оператор-ложь отбрасывается (если присутствует), в противном случае утверждение-истина отбрасывается.

например

if constexpr (std::is_same_v<T, vector<string>>) {
    cout << "The type of A is vector<string>" << endl << endl;
    cout << "First element of A is:" << A[0] << endl;
} 

if constexpr (std::is_same_v<T, vector<vector<string>>>) {
    cout << "The type of A is vector<vector<string>>" << endl;
    cout << "First row first element of A is:" << A[0][0] << endl;
}

LIVE

До C ++ 17 вы можете go с SFINAE или специализация (с шаблонами ) или просто перегруз (даже без шаблонов).

...