Без аргумента шаблон * variadi c в C ++ - PullRequest
1 голос
/ 16 марта 2020
template <bool ...T> 
int some_function()
{
  // this is the function with return type int
  // I am not sure how to get the values into the function
}

// this is how I want to call the function
int temp = some_function<1,0,0,0>();

Есть предложения по объявлению функции?

Ответы [ 3 ]

5 голосов
/ 16 марта 2020

В вашем случае вы можете использовать рекурсию, чтобы делать то, что вы хотите. Для этого вам нужно две перегрузки. Один с одним параметром bool, а другой с двумя параметрами bool плюс часть variadi c. Это дает вам доступ к каждому значению индивидуально, когда вы проходите путь через пакет параметров. В этом случае это будет выглядеть как

// quick and dirty pow fucntion.  There are better ones out there like https://stackoverflow.com/a/101613/4342498
template <typename T, typename U>
auto pow(T base, U exp)
{
    T ret = 1;
    for (int i = 0; i < exp; ++i)
        ret *= base;
    return ret;
}

template <bool Last>
int some_function()
{
    return Last;
}

template <bool First, bool Second, bool... Rest> 
int some_function()
{
    return First * pow(2, sizeof...(Rest) + 1) + some_function<Second, Rest...>();
}

int main()
{
    std::cout << some_function<1,0,0,0>();
}

Какие выходы:

8
2 голосов
/ 16 марта 2020

Это двоичная версия действительного десятичного числа. Я хочу восстановить десятичное число с этими двоичными файлами.

Хотя вы, возможно, можете сделать это более производительно, std::bitset предлагает довольно простое решение ( живой пример ):

template <bool ...T> 
int some_function()
{
    static_assert(sizeof...(T) < sizeof(int) * CHAR_BIT); // We want this to fit in int with no negatives.

    char binary[]{(T + '0')...}; // Put corresponding '0's and '1's into a string.
    std::bitset<sizeof...(T)> bits(binary); // Use the string to make a bitset.
    return bits.to_ulong(); // Convert the bitset to a number.
}
1 голос
/ 16 марта 2020

Это двоичная версия действительного десятичного числа. Я хочу восстановить десятичное число с этими двоичными файлами. Я предполагаю, что смогу сделать это, когда получу эти двоичные числа как-нибудь!

Если вы можете использовать C ++ 17, поэтому также сворачивание, я полагаю, вы можете написать что-то следующим образом

template <bool ...T> 
int some_function ()
 {
   int ret{};

   return ((ret <<= 1, ret += T), ...);
 }

В C ++ 11 и C ++ 14 это чуть менее элегантно

template <bool ...T> 
int some_function ()
 {
   using unused = int[];

   int ret{};

   (void)unused { 0, (ret <<= 1, ret += T)... };

   return ret;
 }
...