如何将模板类型转换为字符串(如果它也可以是字符串)
How to convert a template type to string if it can be a string too?
我有类:
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_t
std::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_if
或 if 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);
}
}
你可以为to_string
提供一个新的重载
std::string to_string(const std::string& s) { return s; }
您可以将上面的代码放在类中,作为私有方法或合适的命名空间中,以避免在有人使用您的代码并希望编写自己的重载to_string
时可能发生的冲突。
编辑:如下面的评论中所述,您不能在std
命名空间中放置这样的重载,因为禁止新的std::to_string
声明,请参阅扩展命名空间 std。
编辑:如果您需要调用std::to_string
,您可能需要在代码中添加一个额外的to_string
模板函数作为
template <typename T>
typename std::enable_if<!std::is_convertible<T, std::string>::value, std::string>::type to_string(T r) const { return std::to_string(r); }
(不要忘记#include <type_traits>
)。
这是因为,即使您导入标准库std::to_string
using namespace std
,成员函数to_string
也将具有优先级。请参阅讨论:C++:为什么成员函数优先于全局函数。在这里,您可以看到一个最小示例。
相关文章:
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如何删除字符串中的前 2 个字符(如果它有"-")
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 检查数组中是否有字符串中的值,如果没有,则添加它
- 有没有办法我可以在 C++ 中使用 if 语句来说明如果一个字符串不是两个名称的 eqal,它会给出一个输出,ATM i
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 如果我在块中编写字符串文字,是否会从数据部分复制整个字符串数据?
- 如果我有很多具有相似前缀的字符串,是否有理由从该前缀创建一个子字符串?
- 如果字符串在 C/C++ 中没有 NUL 字符(以防编译器允许它通过)会发生什么情况?
- 如果字符串向量包含字符'p',如何检查 c++
- 如果用户输入两个或多个由空格分隔的字符串C++如何防止缓冲区溢出?
- 如果用字符串陈述如何发表?在C 中
- 如果我不将预先编写的字符串保存到变量,它还在内存中吗?
- 如何用 c++ 读取 txt 文件,如果我们不知道其中有多少个数据字符串,以及每行有多长?
- 如果两个字符串是字谜,请使用unordered_map确定它们
- C 如果字符串中的char
- 如何将模板类型转换为字符串(如果它也可以是字符串)
- 查找一个字符串(如果它存在于另一个字符串中)
- 常量字符串如果在末尾附加,则不起作用
- C搜索字符串如果类型字符,int类型,操作符类型