【发布时间】:2012-10-24 19:13:08
【问题描述】:
我有一个为许多类型重载的函数。 但我目前的问题是由于这个(LWS 这里: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;
}
我的问题是,当我们为 std::tuple 调用 f() 时,执行的是第三个版本而不是第二个版本。
如何解决这个问题(一个解决方案是只允许定义了<< 的类型的第三个版本,但我不知道该怎么做,如果这是解决问题的最佳方法) ?
【问题讨论】:
-
我对新的 C++11 东西不太熟悉,但我想你需要扩展静态检查
std::is_fundamental<T>并检查std::ostream& operator<<(std::ostream& os, const & T)是否可用。 -
@g-makulik:检查它是否存在比你想象的要困难得多。
-
@MooingDuck 只是出于好奇,您是否有指示如何操作?到目前为止,我一直在使用静态检查来进行概念验证(生成编译错误),而不是用于专业化选择,但这不应该类似吗?
-
@g-makulik:生成编译错误很容易。专业选择一点也不相似,而且相当复杂。请参阅 tstenner 发布的 SFINAE 链接。
标签: c++ templates c++11 operator-overloading typetraits