gpt4 book ai didi

c++ - 派生类和类型检查

转载 作者:行者123 更新时间:2023-11-28 03:24:12 24 4
gpt4 key购买 nike

我正在尝试编写一个方法,该方法将派生自 std::string 的类作为参数。该方法重载了几个不同的函数签名。如果我尝试使用 std::string 调用它,我希望编译失败,或者至少是运行时错误,但显然编译器对我来说太聪明了。

class NotAString : public std::string {
NotAString(std::string str) : std::string(str) { }
};


class Foo {
Foo();
void bar(NotAString);
void bar(int)
};

编译运行

Foo foo();
foo.bar(NotAString("baz"));

但这样做也是如此:

Foo foo();
foo.bar(std::string("baz"));

我试过像这样使用 typeid(str):

void Foo::Bar(NotAString str) {
if(typeid(&str) != typeid(new NotAString()) {
throw std::bad_typeid();
}
}

但是如果向它传递一个 std::string 或 NotAString,它总是会抛出异常。我试过像这样使用 dynamic_cast:

void Foo::Bar(NotAString str) {
if (dynamic_cast<NotAString*>(&str) == NULL) {
throw std::bad_type();
}
}

但它从不抛出异常。

目标是能够区分字符串和代表键值查找的键的字符串。我怎样才能更改我的 NotAString 类或由编译器强制执行一些更严格的类型检查以使其按我希望的方式工作?

最佳答案

问题是您的 NotAString(std::string str) 构造函数不是 explicit所以它允许从 std::stringNotAString 的隐式转换。

当您使用 std::string 调用该函数时,编译器会注意到您可以通过构造函数转换参数来调用它,因此它会创建一个临时的 NotAString并将其传递给函数。

如果你声明它 explicit NotAString(std::string str) 那么它将不允许那些隐式转换。

您在函数内部检查类型的尝试永远不会奏效,此时编译器已经创建了一个NotAString,而您要测试的只是一个NotAString 参数不是 NotAString ...这显然是行不通的。

关于c++ - 派生类和类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14569642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com