Edu*_*yan 3 c++ templates c++11
我想问题的标题没有多大意义,但我希望问题描述能够传播光。
有人可以解释一下这到底是如何通过编译的吗?
template<typename Cont, typename = std::enable_if<std::is_integral_v<std::string>>>
void print(const Cont& cont)
{
for (const auto it : cont) {
cout << it << " ";
}
cout << endl;
}
int main()
{
std::vector<string> V;
print(V);
}
Run Code Online (Sandbox Code Playgroud)
最初的版本是:
template<typename Cont, typename = std::enable_if<std::is_integral_v<typename Cont::value_type>>>
我只是明确地把 std::string 确定下来。
我猜 enable_if 应该完全禁止实例化这个函数?
我在这里缺少什么?
Use*_*ess 13
std::enable_if<false>仍然作为一种类型存在,这就是您推断出未使用的类型参数的内容。
它只是作为一种本身没有嵌套公共成员 typedef 的类型存在type。这就是为什么您必须使用std::enable_if<EXPR>::type或std::enable_if_t<EXPR>获得您期望的行为。
您可以在文档中查看您的用例的示例。
只是为了完整性:
为什么 is_integral_v 是真的?
不是!你只是没有检查你认为你是什么。
在将来,当您遇到的是这样的(它可以是真的很难看到有什么不对,当你知道你的意思写的),试图寻找另一种方式来测试你的假设。你可以打印出来is_integral_v<std::string>看看它是真的还是假的。
或者,当然,请其他人看一下。其他人通常可以立即看到我们的大脑帮助过滤掉的错误。