标签: operator-overloading

没有类的C++用户定义转换运算符?

在C++中是否可以定义非类成员的转换运算符?我知道如何为常规运算符(例如+)执行此操作,但不知道如何为转换运算符执行此操作.

这是我的用例:我使用的是一个C库,它提供了一个PA_Unichar *,其中库定义PA_Unichar为16位int.它实际上是一个用UTF-16编码的字符串.我想将其转换为std::stringUTF-8编码.我已准备好所有转换代码并且正在工作,我只缺少允许我编写的语法糖:

PA_Unichar *libOutput = theLibraryFunction();
std::string myString = libOutput;
Run Code Online (Sandbox Code Playgroud)

(通常在没有临时变量的一行中).

另外值得注意的是:

  • 我知道std::string没有定义隐式转换char*,我知道为什么.同样的原因可能适用于此,但这不是重点.

  • 我有一个ustring子类,std::string它定义了正确的转换运算符PA_Unichar*.它可以工作,但这意味着使用ustring变量代替std::string,然后需要转换到std::string我将这些字符串与其他库一起使用时.所以这并没有多大帮助.

  • 使用赋值运算符不起作用,因为它们必须是类成员.

那么,是否可以定义两种类型你不(在我的情况下,控制之间的隐式转换操作符PA_Unichar*std::string),这可能是也可能不是一流的类型?

如果不是什么可以解决?

c++ operator-overloading coercion

6
推荐指数
3
解决办法
1万
查看次数

C#隐式运算符和ToString()

我正在创建自己的类型来表示css值(例如像素,例如12px).为了能够添加/减去/乘以/ ...我的类型和整数我已经在int中定义了两个隐式运算符.一切都很好,除了一件事..如果我写:

CssUnitBase c1 = 10;
Console.WriteLine(c1);
Run Code Online (Sandbox Code Playgroud)

我得到"10"而不是"10px" - 使用隐式转换为int而不是ToString()方法.我怎么能防止这种情况?

c# operator-overloading implicit-cast

6
推荐指数
2
解决办法
1961
查看次数

'std :: cout <<中'operator <<'的模糊重载

我有以下main.cpp文件

#include "listtemplate.h"
//#include <iostream>
using namespace std;

int main()
{
    int UserChoice;
    cout << "Hello, World!" << endl;
    cin >> UserChoice;
    cout << UserChoice;
}
Run Code Online (Sandbox Code Playgroud)

在它目前的形式,一切正常.我输入一个整数,并将该整数打印到屏幕上.但是,当我取消注释该cout << "Hello, World!" << endl行时,我收到以下错误

main.cpp:10: error: ambiguous overload for ‘operator<<’ in ‘std::cout << "Hello, World!"’
Run Code Online (Sandbox Code Playgroud)

我也可以通过注释掉#include"listtemplate.h",取消注释hello world line,并包括<iostream>main(目前可通过模板访问)来使其工作.任何人都能看到我在这里缺少的东西吗?

listtemplate.h

#ifndef LISTTEMPLATE_H
#define LISTTEMPLATE_H
#include "list.h"
using namespace std;

// Default constructor
template <class Type>
list<Type> :: list() : Head(NULL) {}

// Destructor
template <class Type>
list<Type> …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading

6
推荐指数
2
解决办法
2万
查看次数

重载+ =,+,==和!=运算符

可能重复:
为什么我们必须在C#中定义==和!=?

为什么重载+ =只能通过重载+,但==和!=分别重载?
它似乎应该倒置.
+ =重载几乎总是可以写得更有效,因为没有必要为新对象分配内存.但是我不能发明一个例子,其中运算符==和!=应该是不同的,除了反转结果Equals().

c# operator-overloading

6
推荐指数
1
解决办法
567
查看次数

在c ++中重载间接运算符

我的问题很简单.我有一个类模板,它包含一个指向动态分配类型的指针.我想重载间接运算符,以便引用带有 - >运算符的类模板实例,我被重定向,就像我直接使用包含在其中的指针一样.

template<class T>
class MyClass
 {
  T *ptr;
  ...
  // created dynamic resource for ptr in the constructor
 };
Run Code Online (Sandbox Code Playgroud)

创建某种类型的myclass:

MyClass<SomeObject> instance;
Run Code Online (Sandbox Code Playgroud)

所以我想要的不是必须键入:

instance.ptr->someMemberMethod();
Run Code Online (Sandbox Code Playgroud)

我只需输入:

intance->someMemberMethod();
Run Code Online (Sandbox Code Playgroud)

即使你instance不是一个指针,它的行为就像指针所instance包含的一样.如何通过超载运营商来弥补这一差距?

c++ operator-overloading indirection

6
推荐指数
2
解决办法
6325
查看次数

具有隐式转换的C++类字符串类

我有几个类似字符串的类,可以隐式转换为字符串.我对这些有一些用处; 一个例子是保存需要在运行时由gettext翻译的文本:

class TranslatableString
{
public:
  explicit TranslatableString(const char *s) : native_text_(s) {}
  operator const char *() const { return gettext(native_text_); }

  // Or not - see below:
  operator const std::string() const { return gettext(native_text_); }

private:
  const char * const native_text_;
};
Run Code Online (Sandbox Code Playgroud)

现在我正在努力使这个类尽可能简单(即,使用它应该尽可能像字符串文字).特别是,我希望以下两个示例用法都能正常工作:

const TranslatableString HELLO = TranslatableString("Hello, world!");

std::string ExampleA() {
  return HELLO;
}

void ExampleB() {
  std::string s;
  s = HELLO;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让两个例子都有效?

  • 如果我包含operator std::string,那么ExampleB无法编译,说在std::string::operator=(const char *)和之间存在歧义std::string operator=(const std::string&)(这是有道理的). …

c++ string operator-overloading implicit-conversion

6
推荐指数
1
解决办法
990
查看次数

A min = C++中的习语?

我们用

x += y
Run Code Online (Sandbox Code Playgroud)

代替

x = x + y
Run Code Online (Sandbox Code Playgroud)

*,/,-和其他运营商类似.那么,那怎么样

x min= y
Run Code Online (Sandbox Code Playgroud)

代替

x = std::min(x, y)
Run Code Online (Sandbox Code Playgroud)

?这个命令是否有一个常用的习惯用法,不需要用另一个操作符(不可能)扩展该语言?

c++ operator-overloading idiomatic min c++11

6
推荐指数
1
解决办法
310
查看次数

当我重载subsref(下标引用)时,为什么MATLAB会抛出"太多的输出参数"错误?

作为一个玩具示例,我有一个类,它简单地将一个向量或矩阵包装在一个对象中,并包含一个创建时间的时间戳.我试图超载subsref这样

  1. () 引用的工作方式与标准向量和矩阵类型完全相同
  2. {}引用的工作方式与引用完全相同()(换句话说,与单元格无关)
  3. .引用允许我访问对象的私有属性以及非技术属性的其他字段.

码:

classdef TimeStampValue

    properties (Access = private)
        time;
        values;
    end

    methods
        %% Constructor
        function x = TimeStampValue(values)
            x.time = now();
            x.values = values;
        end

        %% Subscripted reference
        function x = subsref(B, S)
            switch S.type
                case '()'
                    v = builtin('subsref', B.values, S);
                    x = TimeStampValue(v);
                case '{}'
                    S.type = '()';
                    v = builtin('subsref', B.values, S);
                    x = TimeStampValue(v);
                case '.'
                    switch S.subs
                        case 'time'
                            x …
Run Code Online (Sandbox Code Playgroud)

matlab operator-overloading

6
推荐指数
1
解决办法
7779
查看次数

可以在Swift中重载+ =运算符吗?

是否有可能在Swift中重载+ =运算符来接受例如CGFloat参数?如果是这样,怎么样?

我的方法(下面)不起作用.

infix operator += { associativity left precedence 140 }
public func +=(inout left: CGFloat, right: CGFloat) {
    left = left + right
}
Run Code Online (Sandbox Code Playgroud)

(编辑)重要:

上面的编码方法确实有效.请参阅下面答案以解释为什么我认为它没有.

overloading operator-overloading operators ios swift

6
推荐指数
2
解决办法
2321
查看次数

为什么要创建一个具有一个operator()的单个成员的类?

我试图在那里找出 - 一个很好的技术原因来定义一个只包含一个成员的类,这个成员碰巧是一个operator().

我偶然发现了一个人 - 无论出于什么原因 - 创建了一个包含几个类的命名空间,但每个类只包含一个operator()作为成员.

我很清楚,这些类可能会被用作方法(很可能),但为什么这是一个很好的技术方法(我假设有一个很好的方法),而不是简单地定义一组不同的方法单例类,在这种特殊情况下属于上面提到的命名空间.

命名空间看起来像:

namespace myNamespace {
   class ClassA {
   public:
      void operator()();
   };

   class ClassB {
   public:
      int operator()(arg1, arg2);
   };

   ...
}
Run Code Online (Sandbox Code Playgroud)

这仅仅是个人品味/风格的问题还是这是先进/精致设计的表现?我认为这个设计包含了我尚未收集的一些明智的知识,但另一方面,我没有找到一篇文章或问题来讨论这一点 - 这让我怀疑设计中的这种"明智的知识".

这里的专家有什么要说的?

提前致谢!

编辑

再次问好!我接受这个问题是一个重复的问题,其答案可以在这里找到.

"Functor"一词对我来说是未知的,在试图找到我怀疑的答案时(在提出这个问题之前),我没有看到任何对这个术语的引用.

我仍然接受谢尔盖的答案,因为他的答案向我介绍了这个词,他的解释是回答我的问题.他的回答 - 从我的观点来看 - 通过我在上面所说的链接中找到的答案得到了扩展.

谢谢!

c++ oop operator-overloading operator-keyword

6
推荐指数
1
解决办法
347
查看次数