- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设我们有一个类可以写入输出内容
class Writer
{
public:
int write(const std::string& str);
int write(const char* str, int len);
//...
};
我对这个、它的灵 active 以及所有这些都很好,直到我意识到
char* buf = new char[n]; //not terminated with '\0'
//load up buf
Writer w;
w.write(buf); //compiles!
那是一个真的讨厌的错误。
我们可以通过一些模板进行一些修改
class WriterV2
{
public:
int write(const std::string& str);
int write(const char* str, int len);
template<typename... Args>
int write(const char*, Args...)
{ static_assert(sizeof...(Args) < 0, "Incorrect arguments"); }
//...
};
但是这个方法有它的问题
WriterV2 w;
w.write("The templating genius!"); //compile error
我该怎么办?什么是更好的设计?
在任何人询问之前,重载 const char (&)[N]
does not work .创建一个包装器来执行此操作可能是可行的,但这似乎...有点矫枉过正?
编辑 添加一个方法 write(char*)
并在那里发出错误并不理想。当通过函数传递 buf
时,它可能会变成 const char*
。
最佳答案
ICS (Implicit Conversion Sequences)正如您所注意到的,在 C++ 中的重载解析过程中会产生令人惊讶的结果,而且也很烦人..
您可以提供所需的必要接口(interface),然后通过利用 partial ordering 谨慎地使用模板来处理 string literal vs const char*
惨败删除
不需要的重载。
代码:
#include <iostream>
#include <string>
#include <type_traits>
class Writer
{
public:
int write(std::string&&) { std::cout << "int write(std::string)\n"; return 0; }
int write(const std::string&) { std::cout << "int write(const std::string& str)\n"; return 0; }
int write(const char*, int){ std::cout << "int write(const char* str, int len)\n"; return 0; }
template<std::size_t N = 0, typename = std::enable_if_t<(N > 0)> >
int write(const char (&)[N]) { std::cout << "int write(string-literal) " << N << " \n"; return 0; }
template<typename T>
int write(T&&) = delete;
};
int main(){
char* buf = new char[30];
const char* cbuf = buf;
Writer w;
//w.write(buf); //Fails!
//w.write(cbuf); //Fails!
w.write(buf, 30); //Ok! int write(const char*, int);
w.write(std::string("Haha")); //Ok! int write(std::string&&);
w.write("This is cool"); //Ok! int write(const char (&)[13]);
}
打印:
int write(const char* str, int len)
int write(std::string)
int write(string-literal) 13
请注意,上述解决方案继承了“使用不受约束的转发引用 重载函数”的缺点。这意味着重载集中可行函数的参数类型的所有 ICS 都将被“删除”
关于c++ - 接口(interface)设计: safety of overloaded function taking string and char array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43819900/
“过载”/“过载”在编程方面是什么意思? 最佳答案 这意味着您提供了一个具有相同名称但具有不同签名的函数(方法或运算符)。 例如: void doSomething(); int doSomethin
Kotlin 是允许我们轻松定义各种预定义运算符行为的语言之一,该操作名为运算符重载 - https://kotlinlang.org/docs/reference/operator-overload
所以我正在尝试实现 xorshift PRNG 作为来自 random 的参数化 STL 样式类,例如std::mersenne_twister_engine , 所以我可以将它与来自 random
请给我一个具体的答案,为什么函数覆盖会隐藏基类中重载的函数。 class Base{ public: fun(int,int); fun(B); }; class Derived:public
假设我在 Alloy 4.2 中有以下签名声明: sig Target {} abstract sig A { parent: lone A, r: some Target } sig
我正在对API进行建模,其中方法重载将是一个很好的选择。我的幼稚尝试失败了: // fn attempt_1(_x: i32) {} // fn attempt_1(_x: f32) {} // Er
在方法重载中,重载方法是否可以有不同的返回类型? 例如, void foo(int x) ; int foo(int x,int y); double foo(String str); 在一般的面向对
这个问题已经有答案了: Why is implicit conversion from int to Long not possible? (3 个回答) 已关闭 5 年前。 使用包装类重载方法 vo
我正在为一个 API 建模,其中方法重载非常适合。我天真的尝试失败了: // fn attempt_1(_x: i32) {} // fn attempt_1(_x: f32) {} // Error
我正在为一个 API 建模,其中方法重载非常适合。我天真的尝试失败了: // fn attempt_1(_x: i32) {} // fn attempt_1(_x: f32) {} // Error
1、方法的重载 方法名一样,但参数不一样,这就是重载(overload)。 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一
我正在设计我自己的编程语言(称为 Lima,如果你在 www.btetrud.com 上关心它),我正在努力思考如何实现运算符重载。我决定在特定对象上绑定(bind)运算符(它是一种基于原型(prot
我正在尝试将运算符用于 Wicket,这非常冗长。 我最想要的功能是使用一元“+”到add()一个组件。 但它需要在每个 MarkupContainer 的上下文中工作。后人。 使用应该是这样的: c
运算符重载如何与函数重载相关联。我的意思是我不太明白如何使用自身已重载的函数来重载运算符。 最佳答案 Operator 只是给中缀函数(写在参数之间的函数)的时髦名称。所以,1 + 2 只是一个 +(
是否有可能过载 __cinit__或 __add__ ? 像这样的东西: cdef class Vector(Base): cdef double x, y, z def __cini
我开始使用 smalltalk,我正在尝试添加一个新的赋值运算符 :> . pharo 中使用的当前运算符不是选择器,所以我开始查看下划线 _ 的类 Scanner可以为分配启用。我试图以类似的方式做
假设我有以下类(class): class A { has $.val; method Str { $!val ~ 'µ' } } # Is this the right way
我试图像这样重载>>运算符: class A {} multi sub infix:«>>»(A:D $a, Str() $b) is assoc { dd $a; dd $b } my $x = A
在 C++ 中,您可以创建使用特定运算符的模板类 模板化对象和实例化这些对象的类 必须重载该特定运算符才能使其对象与 模板类。例如,insertion BST实现的方法 可能依赖 Nil ) {
有时,我在未重载的方法后面有“overload”关键字。 除了代码的可读性和可维护性之外,这还有我应该注意的其他影响吗? 最佳答案 最大的区别在于,当方法的参数不正确时,错误消息对于非重载方法来说明显
我是一名优秀的程序员,十分优秀!