繁体   English   中英

如何检查传递给模板函数的变量类型是否为字符串? (C++)

[英]How can I check if the type of my variable passed to template function is a string? (C++)

我正在编写一个模板函数,它根据传递给它的变量的类型返回一个特定的字符串。 具体来说,我想知道如何检查该类型是否是字符串,以及它是否是仅包含数字“1”的字符串。

我在使用typeid来确定传递的变量是否为字符串时遇到问题。

我已经尝试过这个解决方案,然后返回了关于条件的新字符串。

if ((typeid(variable) == typeid(std::string)) && (variable == "1"))

任何帮助将不胜感激,谢谢。

由于T必须在编译时已知,以便编译器为(a_variable == "1")生成代码,因此以您的方式使用typeid()将要求您显式a_variable以访问其值在运行时(当a_variable不是std::string时,想想编译器试图为(a_variable == "1")生成什么代码),例如:

#include <typeinfo>

template <typename T>
std::string the_type(T a_variable) {
    std::string r_string;

    if (typeid(T) == typeid(std::string)) {
        if (reinterpret_cast<std::string&>(a_variable) == "1") {
            r_string = "a string containing 1";
        } else {
            r_string = "just a string";
        }
    }

    ...
  
    return r_string;
}

现场演示

在 C++17 及更高版本中,您可以使用if constexpr在编译时使用std::is_same执行模板参数的类型检查,不需要类型转换,例如:

#include <type_traits>

template <typename T>
std::string the_type(T a_variable) {
    std::string r_string;

    if constexpr (std::is_same_v<T, std::string>) {
        if (a_variable == "1") {
            r_string = "a string containing 1";
        } else {
            r_string = "just a string";
        }
    }

    ...
  
    return r_string;
}

现场演示

否则,只需使用模板特化:

template <typename T>
std::string the_type_helper(T) {
    return "not a string";
}
 
template <>
std::string the_type_helper<std::string>(std::string a_variable) {
    if (a_variable == "1") {
        return "a string containing 1";
    } else {
        return "just a string";
    }
}
 
template <typename T>
std::string the_type(T a_variable) {
    std::string r_string;
 
    r_string = the_type_helper<T>(a_variable);
 
    ...

    return r_string;
}

现场演示

这一行有一个逻辑类型错误:

if ((typeid(variable) == typeid(std::string)) && (variable == "1"))

当您说(variable == "1") ,您是在告诉编译器验证您插入的整个字符串是否等于 char 1

我会首先询问编译器是变量是字符串,如果答案是肯定的,则创建一个容器来存储您的字符串并使用迭代函数遍历每个字符以验证您是否有字符"1"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM