【问题标题】:C++ std::experimental::is_detected not working in MSVCC++ std::experimental::is_detected 在 MSVC 中不起作用
【发布时间】:2020-10-17 00:57:41
【问题描述】:

我有一些代码允许将值转换为字符串,这在 g++ 和 CLion 中完美运行,但是当我尝试在 Visual Studio 中使用 MSVC 运行相同的程序时,程序会出现许多错误,其中一些是很奇怪的语法错误。

这是我正在使用的代码:

// 1- detecting if std::to_string is valid on T
 
template<typename T>
using std_to_string_expression = decltype(std::to_string(std::declval<T>()));
 
template<typename T>
constexpr bool has_std_to_string = is_detected<std_to_string_expression, T>;
 
 
// 2- detecting if to_string is valid on T
template<typename T>
using to_string_expression = decltype(to_string(std::declval<T>()));
 
template<typename T>
constexpr bool has_to_string = is_detected<to_string_expression, T>;
 
 
// 3- detecting if T can be sent to an ostringstream
 
template<typename T>
using ostringstream_expression = decltype(std::declval<std::ostringstream&>() << std::declval<T>());
 
template<typename T>
constexpr bool has_ostringstream = is_detected<ostringstream_expression, T>;



// -----------------------------------------------------------------------------


// 1-  std::to_string is valid on T
template<typename T, typename std::enable_if<has_std_to_string<T>, int>::type = 0>
std::string toString(T const& t) {
    return std::to_string(t);
}
 
// 2-  std::to_string is not valid on T, but to_string is
template<typename T, typename std::enable_if<!has_std_to_string<T> && has_to_string<T>, int>::type = 0>
std::string toString(T const& t) {
    return to_string(t);
}
 
// 3-  neither std::string nor to_string work on T, let's stream it then
template<typename T, typename std::enable_if<!has_std_to_string<T> && !has_to_string<T> && has_ostringstream<T>, int>::type = 0>
std::string toString(T const& t) {
    std::ostringstream oss;
    oss << t;
    return oss.str();
}

我想知道我是否在做一些非常明显的错误,或者是否有一些更复杂的东西导致了这个问题。为了使该程序在 Visual Studio 中工作并正确编译,我需要进行哪些更改?

【问题讨论】:

    标签: string visual-studio c++11 visual-c++ g++


    【解决方案1】:

    std::experimental::is_detected 在 Visual Studio 2019 或更早版本中不受支持。不过,您可以很容易地编写自己的跨平台实现,如下所示:https://topanswers.xyz/cplusplus?q=1295

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多