Scott Meyers发表了他的下一本书EC++ 11的内容和状态.他写道,书中的一个项目可能是"避免std::enable_if功能签名".
std::enable_if 可以用作函数参数,返回类型或类模板或函数模板参数,以有条件地从重载解析中删除函数或类.
在这个问题中,显示了所有三个解决方案
作为功能参数:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Run Code Online (Sandbox Code Playgroud)
作为模板参数:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, …Run Code Online (Sandbox Code Playgroud) 我需要一个这样的模板,它可以很好地工作
template <typename container> void mySuperTempalte (const container myCont)
{
//do something here
}
Run Code Online (Sandbox Code Playgroud)
那么我想专门为std :: string上面的模板,所以我想出了
template <typename container> void mySuperTempalte (const container<std::string> myCont)
{
//check type of container
//do something here
}
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,并抛出一个错误.我想让第二个例子起作用然后如果可能我想在模板中添加一些代码以检查是否使用了std :: vector/std :: deque/std :: list,在每个中执行不同的操作案件.所以我使用了模板,因为99%的代码对于矢量和deques等都是相同的.