我有一个字符串区分大小写的函数,该函数使用std::lexicographical_compare
和自定义比较器。
但是,我希望能够将strings
,string_views
和const char*
进行比较,以实现最大的便利和效率。
所以我在想:如果我制作模板,std::string
有begin
/ end
,std::string_view
有begin
/ end
怎么办,...但是const char*
却没有,甚至不是非成员函数。
因此可以这样定义自己的begin
/ end
重载
namespace std {
const char * begin(const char* str) { return str; }
const char * end(const char* str) { return str + strlen(str); }
}
这样我就可以将所有内容与所有内容进行比较
std::lexicographical_compare(std::begin(a), std::end(a), std::begin(b), std::end(b), icomp );
?
如果没有,我还能如何解决我的问题?
答案 0 :(得分:7)
否,这是不合法的,因为def on_open_activate(self,gtkobj,data=None):
print("opening")
textbuffer = textview3.get_buffer()
dialog = gtk.FileChooserDialog("Save file", None,
gtk.FILE_CHOOSER_ACTION_OPEN,
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OPEN, gtk.RESPONSE_OK))
filter_text = gtk.FileFilter()
filter_text.set_name("Text files")
filter_text.add_mime_type("text/plain")
dialog.add_filter(filter_text)
response = dialog.run()
if response == gtk.RESPONSE_OK:
selected_file = dialog.get_filename()
with open(selected_file, 'r') as f:
data = f.read()
print(data)
textbuffer.set_text(data)
textview3.show_all()
self.window3.set_title(selected_file)
self.window3.show_all()
elif response == gtk.RESPONSE_CANCEL:
dialog.destroy()
dialog.destroy()
def gtk_widget_hide(self,gtkobj,data=None):
self.window3.hide()
不是用户定义的类型。
如果C ++程序添加了声明或 命名空间
const char *
或命名空间std
中的命名空间的定义 除非另有规定。程序可以添加模板 任何标准库模板的专业化仅适用于名称空间std
如果声明取决于用户定义的类型,并且 专业化符合标准库要求 原始模板,没有明确禁止
您可以改为在其他命名空间中声明它们,例如std
::
并与不合格的电话一起使用
const char * begin(const char* str) { return str; }
const char * end(const char* str) { return str + strlen(str); }
另外,在C ++ 20中,它的限制更加严格,只允许程序定义类型的类模板专门化
除非另有说明,否则C ++程序的行为是不确定的 如果将声明或定义添加到名称空间
std::lexicographical_compare(begin(a), end(a), begin(b), end(b), icomp );
或 名称空间std
中的名称空间。除非明确禁止,否则程序可以添加模板 任何标准库类模板到名称空间的专业化
std
,但前提是(a)所添加的声明至少取决于一个 程序定义的类型和(b)专业符合标准 原始模板的库要求。