- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码,它试图将二进制数(作为 bool 值列表传递,最低有效优先,可变长度)转换为十进制数:
#include <iostream>
using namespace std;
template<typename T>
int bin_to_dec(int multi, T first) {
cout<<"mutli"<<multi<<endl;
return first?multi:0;
}
template<typename T, typename... Args>
int bin_to_dec(int multi, T first, Args... args) {
cout<<"mutli"<<multi<<endl;
return (first?multi:0) + adder(multi*2, args...);
}
template<typename T, typename... Args>
int bin_to_dec(T first, Args... args) {
cout<<"mutli"<<1<<endl;
return (first?1:0) + adder(2, args...);
}
int main()
{
cout<<bin_to_dec(true, true, false, true)<<endl;
}
它工作得很好,但我想让它只适用于 bool 值,所以当我尝试像 bin_to_dec(1,2,3) 这样的东西时,它不应该编译。我想用类似的东西
template<bool First, bool... Bools>
但我不知道如何进一步处理它。有什么想法吗?
最佳答案
显而易见的方法是从除bool
之外的所有模板参数的重载集中删除该函数。 :
template <typename... T>
std::enable_if_t<variadic_and(std::is_same<T, bool>::value...), int>
bin_to_dec(T... bits) {
// probably delegate to differently named functions as an implementation detail
// ...
}
variadic_and()
将是 constexpr
函数返回 true
如果它的所有参数都是 true
:
constexpr bool variadic_and() { return true; }
template <typename... T>
constexpr bool variadic_and(bool v, T... vs) {
return v && variadic_and(vs...);
}
使用 C++17 variadic_and()
将是必要的,因为可以使用运算符扩展参数包。例如,执行 variadic_and()
可能看起来像这样:
template <typename... T>
constexpr bool variadic_and(T... vs) { return (vs && ...); }
可以直接在 std::enable_if_t<...>
中使用相同的方法.
注意:上面使用的方法要求参数推导为bool
,即,它们几乎需要属于 bool
类型.因为函数不应该用 int
调用参数,这些将转换为 bool
, 测试参数类型是否可转换为 bool
似乎不合适。但是,允许某些转换可能是合理的。如果是这样,将在 std::enable_if_t
的第一个参数中使用相应的特征。 .
关于c++ - 如何专门化模板包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37633225/
我有一个带有模板函数的基类,该函数具有通用模板类型和专用版本。 #ifndef BASE_CLASS #define BASE_CLASS #include using namespace std;
我有这个 3D vector 模板 template class Vec3TYPE{ public: union{ struct{ TYPE x,y,z; }; struct{ TY
我是一名优秀的程序员,十分优秀!