C++ 将字符串与数字进行比较,但不要写入太多运算符重载函数

C++ 将字符串与数字进行比较,但不要写入太多运算符重载函数,c++,C++,以下代码适用于“==”(多亏了πντα提供的ῥεῖ) 当将字符串与数字进行比较时,“>”、“>=”、“!=”、“ “那么,=,!=, “关于,=,!=,我假设您有兴趣了解如何在不重载所有运算符的情况下提供与自定义类型相关的运算符,例如int。实现这一点的一种方法是提供对希望与自定义类型相关的类型的隐式转换(在本例中为int)。请参见下面的示例 #include <iostream> using namespace std; class Foo { public: Foo(in

以下代码适用于“==”(多亏了πντα提供的ῥεῖ) 当将字符串与数字进行比较时,“>”、“>=”、“!=”、“ “那么
=
!=


“关于
=
!=
我假设您有兴趣了解如何在不重载所有运算符的情况下提供与自定义类型相关的运算符,例如int。实现这一点的一种方法是提供对希望与自定义类型相关的类型的隐式转换(在本例中为int)。请参见下面的示例

#include <iostream>
using namespace std;

class Foo
{
 public:
  Foo(int val): _val(val)
  {}

  operator int()
  {
    return _val;
  }

 private:
  int _val;
};


int main()
{
  Foo foo(2);

  cout << foo << endl;
  cout << (foo == 2) << endl;
  cout << (foo > 3) << endl;
}
现在,如果您只对字符串到int的情况感兴趣,我只建议您使用Boost-lexical_cast,如本例所示:

#包括
#包括
int main(int/*argc*/,char*argv[]
{
使用boost::词法转换;
使用boost::bad_词法_cast;
std::向量args;
而(*++argv)
{
尝试
{
args.push_back(词汇投射(*argv));
}
捕获(const bad\u词法\u cast&)
{
参数推回(0);
}
}
}

或者,如果您使用的是C++11,那么只需遵循以下步骤:

我假设您有兴趣了解如何在不重载所有运算符的情况下提供与自定义类型(例如int)相关的运算符。实现这一点的一种方法是提供与自定义类型(在本例中为int)相关的类型的隐式转换.参见下面的示例

#include <iostream>
using namespace std;

class Foo
{
 public:
  Foo(int val): _val(val)
  {}

  operator int()
  {
    return _val;
  }

 private:
  int _val;
};


int main()
{
  Foo foo(2);

  cout << foo << endl;
  cout << (foo == 2) << endl;
  cout << (foo > 3) << endl;
}
现在,如果您只对字符串到int的情况感兴趣,我只建议您使用Boost-lexical_cast,如本例所示:

#包括
#包括
int main(int/*argc*/,char*argv[]
{
使用boost::词法转换;
使用boost::bad_词法_cast;
std::向量args;
而(*++argv)
{
尝试
{
args.push_back(词汇投射(*argv));
}
捕获(const bad\u词法\u cast&)
{
参数推回(0);
}
}
}


或者,如果您使用的是C++11,只需遵循以下步骤:

为什么要转换
argv[1]
到数字。只需将其作为字符串进行比较。无论如何,既然您询问的是
,我建议只使用itoa或to_字符串和/或atoi。这肯定会击败重新发明字符串转换,这将以某种形式成为其中的一部分。似乎您完全误解了我的解决方案,基于您对han的偏见概念在
argv[1]
中输入字符串形式的数字。为什么要转换
argv[1]
到数字。只需将其作为字符串进行比较。无论如何,既然您询问的是
,我建议只使用itoa或to_字符串和/或atoi。这肯定会击败重新发明字符串转换,这将以某种形式成为其中的一部分。似乎您完全误解了我的解决方案,基于您对han的偏见概念在
argv[1]
中输入一个字符串形式的数字。运算符重载问题已在中讨论并澄清。我看不出这如何具体回答OP的问题。答案是建议对自定义类型(或字符串)进行转换,而不是重载运算符。嗯,您可能需要阅读问题的来源。最后是关于数值转换,是的。这正是我所需要的。我从string创建了一个派生类,并添加了此方法
operator int()
现在所有整数比较运算符都能正常工作了!非常感谢。运算符重载问题已在中讨论并澄清。我看不出这是如何具体回答OP的问题的。答案是建议对自定义类型(或字符串)进行转换,而不是重载运算符。嗯,您可能需要阅读问题的来源。最后是关于数值转换,是的。这正是我所需要的。我从string创建了一个派生类,并添加了此方法
operator int()
现在所有整数比较运算符都能正常工作!非常感谢。我需要它,这样当其他用户编写代码时,甚至不知道变量的类型。他们可以随意使用字符串和数字进行比较。Andrzej的解决方案就是我要找的。谢谢@πάνταῥεῖ 不管怎样。我需要它,这样当其他用户编写代码时,甚至不知道变量的类型。他们可以随意使用字符串和数字进行比较。Andrzej的解决方案正是我想要的。谢谢@πάνταῥεῖ 无论如何
#include <iostream>
using namespace std;

class Foo
{
 public:
  Foo(int val): _val(val)
  {}

  operator int()
  {
    return _val;
  }

 private:
  int _val;
};


int main()
{
  Foo foo(2);

  cout << foo << endl;
  cout << (foo == 2) << endl;
  cout << (foo > 3) << endl;
}
2
1
0
#include <boost/lexical_cast.hpp>
#include <vector>

int main(int /*argc*/, char * argv[])
{
    using boost::lexical_cast;
    using boost::bad_lexical_cast;

    std::vector<short> args;

    while (*++argv)
    {
        try
        {
            args.push_back(lexical_cast<short>(*argv));
        }
        catch(const bad_lexical_cast &)
        {
            args.push_back(0);
        }
    }
}