Как оценить тип значения (int или double) в векторе c ++? - PullRequest
3 голосов
/ 07 октября 2019

Я использую шаблон в C ++ для отображения векторного содержимого в Matlab с mexPrintf. Подобно printf, mexPrintf требуется ввод типа (% d или% g). Как и раньше, я знаю тип вектора. У меня есть метод, чтобы судить о типе в шаблоне? Я хочу mexPrintf(" %d", V[i]) для vector<int> и mexPrintf(" %g", V[i]) для vector<double>. Возможно ли это? Мой пример кода ниже.

template<typename  T> void display(T& V)
{
    for (int j = 0; j < V.size(); j++)
    {
        //if
        mexPrintf("\n data is %d\n", V[j]);//int
        //else
        mexPrintf("\n data is %g\n", V[j]);//double
    }
}

Мне может понадобиться суждение для моего if & else. Или какое-либо предложение другого решения?

Ответы [ 2 ]

4 голосов
/ 07 октября 2019

Начиная с C ++ 17, вы можете использовать Constexpr Если :

template<typename T> void display(T& V)
{
    for (int j = 0; j < V.size(); j++)
    {
        if constexpr (std::is_same_v<typename T::value_type, int>)
            mexPrintf("\n data is %d\n", V[j]);//int
        else if constexpr (std::is_same_v<typename T::value_type, double>)
            mexPrintf("\n data is %g\n", V[j]);//double
        else
            ...
    }
}

До C ++ 17 вы можете предоставить вспомогательные перегрузки.

void mexPrintfHelper(int v) {
    mexPrintf("\n data is %d\n", v);//int
}
void mexPrintfHelper(double v) {
    mexPrintf("\n data is %g\n", v);//double
}

затем

template<typename T> void display(T& V)
{
    for (int j = 0; j < V.size(); j++)
    {
        mexPrintfHelper(V[j]);
    }
}
3 голосов
/ 07 октября 2019

Вы можете преобразовать значение в строку, используя std::to_string:

template<typename  T> void display(T& V)
{
    for (int j = 0; j < V.size(); j++)
    {
        mexPrintf("\n data is %s\n", std::to_string(V[j]));
    }
}

Но вы также можете просто использовать стандартный способ вывода текста в C ++:

template<typename  T> void display(T& V)
{
    for (int j = 0; j < V.size(); j++)
    {
        std::cout << "\n data is " << V[j] << '\n';
    }
}

В последних версиях MATLAB std::cout в MEX-файлах автоматически перенаправляется на консоль MATLAB. Для более старых версий MATLAB вы можете сделать это, используя трюк в этот другой ответ .

...