在 MSVC chrono 实现中我看到以下代码
_EXPORT_STD template <int = 0>
_NODISCARD constexpr year_month operator+(const year_month& _Left, const months& _Right) noexcept {
const auto _Mo = static_cast<long long>(static_cast<unsigned int>(_Left.month())) + (_Right.count() - 1);
const auto _Div = (_Mo >= 0 ? _Mo : _Mo - 11) / 12;
return year_month{_Left.year() + years{_Div}, month{static_cast<unsigned int>(_Mo - _Div * 12 + 1)}};
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下为什么它使用带有未命名参数的模板吗?
是否可以像这样重载函数模板(仅在使用 enable_if 的模板参数上):
template <class T, class = std::enable_if_t<std::is_arithmetic<T>::value>>
void fn(T t)
{
}
template <class T, class = std::enable_if_t<!std::is_arithmetic<T>::value>>
void fn(T t)
{
}
Run Code Online (Sandbox Code Playgroud)
如果条件enable_if不重叠?我的 MSVS 编译器抱怨说'void fn(T)' : function template has already been defined. 如果没有,有什么替代方法(理想情况下不要将enable_if其他任何地方放入模板参数中)?
我不小心在编写模板函数专业化时犯了一个错误,结果构造通过了 VS17 编译。(下面包含的代码中的第三个构造)
这是一个有效的构造吗?我该如何调用这个函数?
template <class T> void tempfunc(T t)
{
cout << "Generic Template Version\n";
}
template <>
void tempfunc<int>(int i) {
cout << "Template Specialization Version\n";
}
template <int> void tempfunc(int i)
{
cout << "Coding Mistake Version\n";
}
Run Code Online (Sandbox Code Playgroud)
我无法调用第三个构造。