簡體   English   中英

如何專門化模板包?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM