为const char *定义std :: begin是否合法?

时间:2018-10-26 15:50:10

标签: c++ string string-comparison string-view

我有一个字符串区分大小写的函数,该函数使用std::lexicographical_compare和自定义比较器。

但是,我希望能够将stringsstring_viewsconst char*进行比较,以实现最大的便利和效率。

所以我在想:如果我制作模板,std::stringbegin / endstd::string_viewbegin / 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 );

如果没有,我还能如何解决我的问题?

1 个答案:

答案 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   如果声明取决于用户定义的类型,并且   专业化符合标准库要求   原始模板,没有明确禁止

[namespace.std/1]

您可以改为在其他命名空间中声明它们,例如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)专业符合标准   原始模板的库要求。

[namespace.std]