【问题标题】:How can I check if the type of my variable passed to template function is a string? (C++)如何检查传递给模板函数的变量类型是否为字符串? (C++)
【发布时间】:2020-10-06 17:51:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 宁可使用模板特化。

标签: c++ function templates


【解决方案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;
}

Live Demo

在 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;
}

Live Demo

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

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;
}

Live Demo

【讨论】:

    【解决方案2】:

    此行存在逻辑类型错误:

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

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

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

    【讨论】:

    • 我需要的正是第一点。我需要验证整个字符串确实等于字符“1”。
    • "1" 不是char,而是const char[2]
    • 在这种情况下,首先创建一个新字符串,例如 std::string a = "1";然后你可以做 if (variable.find(a) != string::npos) std::cout
    • @pythonheadache 将检查variable 是否包含 子字符串"1",而不检查variable 是否等于 到整个字符串"1",这就是 OP 想要的
    猜你喜欢
    • 2020-04-25
    • 2013-09-04
    • 2013-12-15
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多