c++ - c++:强制将 std::string 强制转换为 string_view 而不是模板
问题描述
我有以下类声明:
class MyClass {
public :
template <typename StringContainer>
explicit MyClass(const StringContainer&)
{
std::cout << "String container ctor" << std::endl;
}
explicit MyClass(std::string_view)
{
std::cout << "string_view ctor" << std::endl;
}
};
模板化的构造函数版本被实现来处理带有 std::string 的 stl 容器。对于下面的片段,我想调用string_view
ctor 但由于某种原因使用了模板版本。
int main() {
std::string tmp("a");
MyClass test(tmp);
return 0;
}
与ctorstd::string
一起使用的正确投射方式是什么?std::string_view
解决方案
选择您的模板构造函数是因为它std::string
比std::string_view
构造函数更匹配。 StringContainer
被推断为std::string
,对MyClass(const StringContainer&)
进行精确匹配tmp
,而MyClass(std::string_view)
需要从std::string
到的隐式转换std::string_view
。
如果你想std::string_view
调用构造函数,你可以显式地进行转换,例如:
int main() {
std::string tmp("a");
MyClass test(std::string_view{tmp});
return 0;
}
否则,您可以仅为 添加另一个构造函数std::string
,例如:
class MyClass {
public :
template <typename StringContainer>
explicit MyClass(const StringContainer&)
{
std::cout << "String container ctor" << std::endl;
}
explicit MyClass(const std::string&)
{
std::cout << "String ctor" << std::endl;
}
explicit MyClass(std::string_view)
{
std::cout << "string_view ctor" << std::endl;
}
};
int main() {
std::string tmp("a");
MyClass test(tmp); // calls MyClass(const std::string&)
return 0;
}
或者,您可以尝试使用 SFINAE 使模板构造函数与任何不匹配的std::string
或不匹配std::string_view
(我的 SFINAE-fu 不太好,所以我不会尝试在这里提供示例)。
或者,您可以使模板仅与元素的实际容器匹配,这样std::string
传入 astd::string
只能与 匹配std::string_view
,例如:
class MyClass {
public :
template < template <typename, typename...> typename StringContainer >
explicit MyClass(const StringContainer<std::string>&)
{
std::cout << "String container ctor" << std::endl;
}
explicit MyClass(std::string_view)
{
std::cout << "string_view ctor" << std::endl;
}
};
int main() {
std::string tmp("a");
MyClass test(tmp); // calls MyClass(std::string_view)
std::vector<std::string> vec;
MyClass test2(vec); // calls MyClass(const StringContainer&)
return 0;
}
推荐阅读
- python - 在 arcsin [RuntimeWarning] 中遇到无效值
- javascript - 'vue' 未被识别为内部或外部命令
- sql-server - 将 SQL Server 数据库转换为 Azure 时收到有关 master.sys.sysclsobjs 的错误消息
- node.js - npm install 安装到哪个文件夹
- apache-kafka - 如何自动运行 Kafka Connect 连接器(例如在生产中)?
- codenameone - 如何处理组件及其容器中的指针事件?
- rpm - 安装 rpm 包时替换现有目录及其所有内容
- java - 全新安装的 Ubuntu 16.04 LTS 服务器和升级的服务器之间的编码问题
- php - 网络服务器上的 NumberFormatter 输出错误,而不是另一个
- python - 如何在不使用 refresh_from_db 的情况下强制 Django 模型在保存后重新加载字段?