gpt4 book ai didi

c++ - 检查 C++ 中全局运算符 << 是否存在

转载 作者:行者123 更新时间:2023-12-01 18:53:30 24 4
gpt4 key购买 nike

您好,我想编写 to_string 成员函数的两个实现,如下所示:

template <typename T0> class foo
{
public: std::string to_string();
public: T0 m_Value;
};

template <typename T0> std::string foo<T0>::to_string()
{
std::stringstream ss;
ss << m_Value;
return ss.str();
}

template <typename T0> std::string foo<T0>::to_string()
{
return typeid(T0).name();
}

我见过this ,但是我不知道如何使用代码,我根本不习惯enable_if和boost mpl。我应该如何定义两个 to_string 函数以使用第二个函数作为后备?

谢谢。

最佳答案

我对此的看法:您可以按原样使用您找到的元函数,它工作得很好。我们仍然简要讨论一下它为什么起作用:

sizeof实际上并不计算表达式;它推导其类型并返回该类型的大小。类型大小是实现定义的,我们不能对它们做太多假设,但我们知道 sizeof(char) != sizeof(char[2]) ,所以我们使用这些类型来测试。

我们使用any_t在命名空间级别定义流运算符。类型,它将接受 - 你猜对了 - 任何类型并让它返回一些东西(实际上什么类型并不重要,只要它不是 ostream & )。如果该类型没有定义流运算符,我们就会采用这种方法。在类本身中,我们现在定义两个函数,其中一个函数采用 ostream & ,如果定义了流运算符,这将是结果,并且采用我们为后备函数定义的返回类型。

我们现在可以测试sizeof(test(s << c))同样,它不会计算表达式,仅确定返回类型并返回其大小。

现在我们已经了解了它是如何工作的,剩下要做的就是将其嵌入到我们的应用程序中。有几种方法可以做到这一点;一种在 C++11 之前也适用的方法是使用仿函数:

template <bool, typename T>
struct to_string_functor
{
std::string operator()(T const & t) const
{
std::stringstream ss;
ss << t;
return ss.str();
}
};

template <typename T>
struct to_string_functor<false, T>
{
std::string operator()(T const &) const
{
return typeid(T).name();
}
};

template <typename T>
struct foo
{
std::string to_string() const
{
return to_string_functor<
has_insertion_operator<T>::value, T
>()(m_Value);
}
/* ... */
};

还有更多方法可以做到这一点,另一种是 enable_if ,如果 C++11 可供您使用(您可能需要部分专用函数来执行此操作);您可能想阅读this excellent blog post关于这个问题。

但是,在我看来,在这个简单的情况下,仿函数应该可以做到。

关于c++ - 检查 C++ 中全局运算符 << 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18606179/

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