在C++中是否可以定义非类成员的转换运算符?我知道如何为常规运算符(例如+)执行此操作,但不知道如何为转换运算符执行此操作.
这是我的用例:我使用的是一个C库,它提供了一个PA_Unichar *
,其中库定义PA_Unichar为16位int.它实际上是一个用UTF-16编码的字符串.我想将其转换为std::string
UTF-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
),这可能是也可能不是一流的类型?
如果不是什么可以解决?
我正在创建自己的类型来表示css值(例如像素,例如12px).为了能够添加/减去/乘以/ ...我的类型和整数我已经在int中定义了两个隐式运算符.一切都很好,除了一件事..如果我写:
CssUnitBase c1 = 10;
Console.WriteLine(c1);
Run Code Online (Sandbox Code Playgroud)
我得到"10"而不是"10px" - 使用隐式转换为int而不是ToString()方法.我怎么能防止这种情况?
我有以下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#中定义==和!=?
为什么重载+ =只能通过重载+,但==和!=分别重载?
它似乎应该倒置.
+ =重载几乎总是可以写得更有效,因为没有必要为新对象分配内存.但是我不能发明一个例子,其中运算符==和!=应该是不同的,除了反转结果Equals().
我的问题很简单.我有一个类模板,它包含一个指向动态分配类型的指针.我想重载间接运算符,以便引用带有 - >运算符的类模板实例,我被重定向,就像我直接使用包含在其中的指针一样.
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
包含的一样.如何通过超载运营商来弥补这一差距?
我有几个类似字符串的类,可以隐式转换为字符串.我对这些有一些用处; 一个例子是保存需要在运行时由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&)
(这是有道理的). …我们用
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)
?这个命令是否有一个常用的习惯用法,不需要用另一个操作符(不可能)扩展该语言?
作为一个玩具示例,我有一个类,它简单地将一个向量或矩阵包装在一个对象中,并包含一个创建时间的时间戳.我试图超载subsref
这样
()
引用的工作方式与标准向量和矩阵类型完全相同{}
引用的工作方式与引用完全相同()
(换句话说,与单元格无关).
引用允许我访问对象的私有属性以及非技术属性的其他字段.码:
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) 是否有可能在Swift中重载+ =运算符来接受例如CGFloat
参数?如果是这样,怎么样?
我的方法(下面)不起作用.
infix operator += { associativity left precedence 140 }
public func +=(inout left: CGFloat, right: CGFloat) {
left = left + right
}
Run Code Online (Sandbox Code Playgroud)
我试图在那里找出 - 一个很好的技术原因来定义一个只包含一个成员的类,这个成员碰巧是一个operator()
.
我偶然发现了一个人 - 无论出于什么原因 - 创建了一个包含几个类的命名空间,但每个类只包含一个operator()
作为成员.
我很清楚,这些类可能会被用作方法(很可能),但为什么这是一个很好的技术方法(我假设有一个很好的方法),而不是简单地定义一组不同的方法单例类,在这种特殊情况下属于上面提到的命名空间.
命名空间看起来像:
namespace myNamespace {
class ClassA {
public:
void operator()();
};
class ClassB {
public:
int operator()(arg1, arg2);
};
...
}
Run Code Online (Sandbox Code Playgroud)
这仅仅是个人品味/风格的问题还是这是先进/精致设计的表现?我认为这个设计包含了我尚未收集的一些明智的知识,但另一方面,我没有找到一篇文章或问题来讨论这一点 - 这让我怀疑设计中的这种"明智的知识".
这里的专家有什么要说的?
提前致谢!
编辑
再次问好!我接受这个问题是一个重复的问题,其答案可以在这里找到.
"Functor"一词对我来说是未知的,在试图找到我怀疑的答案时(在提出这个问题之前),我没有看到任何对这个术语的引用.
我仍然接受谢尔盖的答案,因为他的答案向我介绍了这个词,他的解释是回答我的问题.他的回答 - 从我的观点来看 - 通过我在上面所说的链接中找到的答案得到了扩展.
谢谢!