如何将 typename 变量参数转换为字符串

How do I cast a typename variable parameter as a string

问题:如果数组是整数、双精度、浮点数等,我正在尝试创建一个能够找到最大数的函数。如果给定的数组是字符串,它 returns 中的字符串字母最多的字符串。但是,我不知道如何将 list [0] 和 list[i] 转换为字符串。

#include <isostream>
#include <algorithm>
using namespace std;
    unsigned int strlength(string word) {
            char *ch = &word[0];
            unsigned int count = 0;
            while (*ch != '[=10=]') {
                count++;
                ch++;
            }
    
            return *count;
        }
       
    
        template<typename U>
        U maxNumber(U list[], int size) {
            unsigned int i;
            if (typeid(list) == typeid(string*)) {
                unsigned int i;
                for (i = 0; i < size; i++) {
                    if (strlength(list[0]) < strlength(list[i])) {
    
                        list[0] = list[i];
                    }
                    else {
                        list[0] = list[0];
                    }
                }
    
                return list[0];
            }
            else {
                for (i = 0; i < size; i++) {
                    if (list[0] < list[i]) {
                        list[0] = list[i];
                    }
                    else {
                        continue;
                    }
                }
                return list[0];
    
            }
        }

if (typeid(list) == typeid(string*)) 是错误的工具。

你需要编译时分支,

  • if constexpr

    template<typename U>
    U maxNumber(U list[], int size) {
        if constexpr (std::is_same_v<U, std::string>) {
            auto less_by_size = [](const auto& lhs, const auto rhs){
                return lhs.size() < rhs.size(); };
            return *std::max_element(list, list + size, less_by_size);
        } else {
            return *std::max_element(list, list + size);
        }
    }
    
  • 或通过overload/tag调度

    std::string maxNumber(std::string list[], int size) {
        auto less_by_size = [](const auto& lhs, const auto rhs){
            return lhs.size() < rhs.size(); };
        return *std::max_element(list, list + size, less_by_size);
    }
    template<typename U>
    U maxNumber(U list[], int size) {
        return *std::max_element(list, list + size);
    }