[英]How to specialize template pack?
我有以下代碼,該代碼嘗試將二進制數(作為布爾值列表(最低有效,第一個,變量長度)傳遞)轉換為十進制數:
#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;
}
它工作得很好,但我只想讓布爾值成為可能,所以當我嘗試類似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
使用相應的特征。
只需使用靜態斷言即可。 這非常好用:
int bin_to_dec() {
return 0;
}
template<typename T, typename ... Args>
int bin_to_dec(T first, Args ... rest)
{
static_assert(std::is_same<bool, T>::value, "Only valid for bools");
return (first ? 1 : 0) + (bin_to_dec(rest...) << 1);
}
int main()
{
cout<<bin_to_dec(true, true, false, true)<<endl;
cout<<bin_to_dec(1, 2, 3)<<endl; //compile error
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.