vendredi 26 juin 2020

C++ std::experimental::is_detected not working in MSVC

I have some code which allow a value to be converted into a string, and this works perfectly in g++ and CLion, however when I try to run the same program with MSVC in Visual Studio the program gives many errors, some of which are syntax errors which is quite odd.

This is the code I am using:

// 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();
}

I wonder if I am doing something very obviously wrong, or if there is something a bit more complicated leading to the issue. What do I need to change in order to make this program work in Visual Studio and compile correctly?

Aucun commentaire:

Enregistrer un commentaire