gpt4 book ai didi

c++ - 如何检查变量是否派生自类?

转载 作者:可可西里 更新时间:2023-11-01 17:43:59 26 4
gpt4 key购买 nike

我想打印多种类型的变量。我创建了一个名为 IStringable 的类,以及派生自它的一些类。在我的 PrintVariable函数我想检查参数是否来自IStringable , 如果是,则打印它。

class IStringable {
public:
virtual ~IStringable() { }
virtual std::string ToString() const = 0;
}

class Person : public IStringable {
public:
Person(const std::string name) : _name(name) { }
virtual std::string ToString() const { return _name; }
private:
std::string _name;
}

// This does not work as intended, as I don't know how it could be implemented
template <>
void PrintVariable<IStringable>(const IStringable& var) {
std::cout << var.ToString() << std::endl;
}

int main() {
Person p("Foo");
PrintVariable(p);
}

到目前为止,我已经通过使用 std::cout << p.ToString() << std::endl; 解决了这个问题。相反,但我想知道是否有更好的解决方案。

最佳答案

你不需要模板:

void PrintVariable(const IStringable& var) {
std::cout << var.ToString() << '\n';
}

只有调用可转换为 IStringable 的对象的 PrintVariable 才是合法的:

Person p("Alice");
struct Bob {} b;
PrintVariable(p); // OK
PrintVariable(b); // ill-formed: no conversion from Bob to const IStringable&

此外,您可以将 PrintVariable 重新设计为运算符:

std::ostream& operator<<(std::ostream& os, IStringable const& rhs)
{
return os << rhs.ToString();
}

所以你可以这样写:

Person p("Alice");
std::cout << p << '\n';

从评论中可以看出,OP 想要一种记录内容的方法。一个最小的实现是:

#include <string_view>
#include <type_traits>
#include <iostream>

namespace Logger
{
struct IStringable
{
virtual ~IStringable() {}
virtual std::string ToString() const = 0;
};

std::string to_string(IStringable const& v) { return v.ToString(); }

void log(std::string_view const& sv)
{
std::cout << "debug: " << sv << '\n';
}
template<class T, std::enable_if_t<!std::is_convertible_v<T, std::string_view>, int> = 0>
void log(T const& v)
{
using std::to_string;
log(to_string(v));
}
}

想法是使用ADLSFINAE在要记录的事物上调用 std::to_stringISrtingable::ToString,并记录结果字符串。

用法:

class Person : public Logger::IStringable {
public:
Person(const std::string name) : _name(name) { }
virtual std::string ToString() const { return _name; }
private:
std::string _name;
};

int main()
{
Person p("Alice");
double d = 0.0;
const char* c = "Some words";

Logger::log(p);
Logger::log(d);
Logger::log(c);
}

演示:https://coliru.stacked-crooked.com/a/77e19e87c9d4780d

关于c++ - 如何检查变量是否派生自类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56474248/

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