我有一个为多种类型重载的函数。
但我目前的问题是由于(LWS here : lws ):
#include <iostream>
#include <string>
#include <sstream>
#include <type_traits>
// First version
template<typename T, class = typename std::enable_if<std::is_fundamental<T>::value>::type>
std::string f(const T& x)
{
return std::to_string(x);
}
// Second version
template<typename... T>
std::string f(const std::tuple<T...>& x)
{
return std::to_string(sizeof...(T)); // It's just an example here
}
// Third version
template<typename T, class = typename std::enable_if<!std::is_fundamental<T>::value>::type, class = void>
std::string f(const T& x)
{
std::ostringstream oss;
oss<<x;
return oss.str();
}
// Main
int main(int argc, char* argv[])
{
std::cout<<f(42)<<std::endl;
std::cout<<f(std::string("Hello World"))<<std::endl;
std::cout<<f(std::tuple<int, int, int, int, int, int>(4, 8, 15, 16, 23, 42))<<std::endl;
return 0;
}
我的问题是,当我们为
f()
调用 std::tuple
时,会执行第三个版本而不是第二个版本。如何解决这个问题(一个解决方案是只允许定义了
<<
的类型的第三个版本,但我不知道如何做到这一点,如果这是解决问题的最佳方法)? 最佳答案
您唯一的问题是您忘记了 #include <tuple>
,这显示在 LWS 上的错误中。 Here's a fixed version 编译正确。第二个重载总是比第三个更好的匹配,因为它根据偏序规则更专业。
如果您仍然想知道如何检查是否存在触发 SFINAE 的函数(如果它不存在),请查看 this answer of mine 上专门针对该主题的问题。 :) 它甚至有一个与您想要的非常匹配的示例。
关于c++ - 仅当类型具有 "<<"运算符时才重载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13056108/