gpt4 book ai didi

c++ - 如果模板类型也可以是字符串,如何将其转换为字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:16 35 4
gpt4 key购买 nike

我有课:

template <typename val_t>
class tracer_t : public base_tracer_t<val_t> {
std::vector<std::string> m_trace;
public:
virtual void push_fact(val_t fact) override {
std::string str = "+ fact: " + to_string(fact);
m_trace.push_back(std::move(str));
}

virtual void push_rule(const std::string &id, val_t val, bool tg) override {
std::string str = "+ ";
if (tg) { str += "target: "; }
else { str += "rule: "; }
str += id + " -> " + to_string(val);
m_trace.push_back(std::move(str));
}

virtual void print() override {
std::cout << "Stack trace: " << std::endl;
for (auto it = m_trace.begin(); it != m_trace.end(); ++it) {
std::cout << (*it) << std::endl;
}
}
private:
std::string to_string(val_t val) {
if (std::is_same<val_t, std::string>::value) {
return (std::string)val;
}
return std::to_string(val);
}
};

问题是,如果 val_tstd::string,它不会编译,因为:

tracer.hpp:49: error: no matching function for call to ‘to_string(std::__cxx11::basic_string<char>&)’
return std::to_string(val);
~~~~~~~~~~~~~~^~~~~

但我不知道如何解决它。我尝试手动检查类型,但错误出现在编译时,所以它没有帮助

最佳答案

如果您不想为 std::string 特化整个类,您可以使用 std::enable_ifif constexpr (c++17)

auto to_string(val_t val)
-> typename std::enable_if<std::is_same<val_t, std::string>::value, std::string>::type
{
return static_cast<std::string>(val);
}

auto to_string(val_t val)
-> typename std::enable_if<!std::is_same<val_t, std::string>::value, std::string>::type
{
return std::to_string(val);
}

或者更现代的方法,使用 if constexpr

auto to_string(val_t val)
{
if constexpr (std::is_same<val_t, std::string>::value)
{
return static_cast<std::string>(val);
}
else
{
return std::to_string(val);
}
}

关于c++ - 如果模板类型也可以是字符串,如何将其转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54286969/

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