【问题标题】:Can I get input without declaring a variable type or declare multiple type for same variable in c++?我可以在不声明变量类型的情况下获取输入,或者在 C++ 中为同一个变量声明多个类型吗?
【发布时间】:2014-02-10 20:57:50
【问题描述】:

我想得到一个可以是整数或字符串的输入,并希望将其传递给重载函数,以便可以自动检测候选函数并生成输出。有没有办法做到这一点?

【问题讨论】:

  • 您可以使用模板。
  • @gartenriese 模板在这里无济于事。他想根据用户是否输入数字而遵循不同的代码路径。
  • 您尝试过但失败的代码示例,以及有关您希望发生的情况的注释,将非常有帮助。正如所写的那样,您要求按值而不是按类型推导(或者看起来如此)进行编译时候选选择。对此我会回答不。如果这不能准确描述您要执行的操作,则需要发布更多信息。
  • 输入是总是一个字符串。想一想。
  • @dvnrrs:不会这样工作:T getInput();自动 x = getInput();

标签: c++


【解决方案1】:

没有办法自动完成,但您当然可以通过编程方式完成。

  • 读入一个字符串。
  • 检查字符串是否为有效数字。
  • 如果是数字,则获取其值(通过atoi() 或类似方法)并将其传递给函数的整数版本。
  • 否则,将字符串传递给函数的字符串版本。

没有办法“免费”获得这个,因为编译器在编译时无法知道输入是否为数字。

【讨论】:

  • 你能否建议我一个检查字符串是否是有效数字的好方法。我对 c++ 很陌生(也是整体编程)
【解决方案2】:

如果您可以使用boost,我能想象到的最接近您想要的方法是使用boost::variant<int,std::string> 并重载>> 流运算符,例如this other question

【讨论】:

    【解决方案3】:

    你可以使用Boost's lexical_cast,或者不太复杂(取决于你需要什么),std::strtol() 或者字符串流:

    #include <cstdlib>
    #include <iostream>
    #include <sstream>
    
    void Process( const long         num ) { std::cout << "int: " << num << "\n"; }
    void Process( const std::string& str ) { std::cout << "str: " << str << "\n"; }
    
    int main()
    {
        std::string s;
        while( std::cin >> s )
        {
            char* end;
            const auto i = std::strtol( s.c_str(), &end, 10 );
            if( end == s.c_str() + s.length() )
                Process( i );
            else
                Process( s );
    
            std::istringstream iss( s );
            int j;
            if( iss >> j )
                Process( j );
            else
                Process( s );
        }
    }
    

    输入“abc 123”,我得到输出:

    str: abc
    str: abc
    int: 123
    int: 123
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 2016-09-18
      相关资源
      最近更新 更多