1 Востаннє редагувалося Lokki (13.02.2017 23:53:55)

Тема: Незрозумілий синтаксис в С++17

Привіт. Небуло чим зайнятися сьогодні і вирішив подивитися що цікавого є в новому станарті С++17.
Зустрів такий код:

#include <type_traits>
#include <variant>
#include <algorithm>
#include <string>
#include <array>
#include <iostream>
#include <assert.h>

template<typename ... B>
struct Visitor : B...
{
    template<typename ... T>
    Visitor(T && ... t) : B(std::forward<T>(t))...
    {
    }
    using B::operator()...;
};

template<typename ... T>
Visitor(T...) -> Visitor<std::decay_t<T>...>;

int main(){ 
  
  std::array<std::variant<double,int>, 2> a{3.2, 2};
  int intTotal = 0;
  double doubleTotal = 0.0;
  Visitor visitor{ [&intTotal](const int i){ intTotal += i;},
                  [&doubleTotal](const double d) { doubleTotal += d;}
                 };
      
  std::for_each(begin(a), end(a), 
                [&visitor](const auto& v){std::visit(visitor, v);});
  
  return intTotal;
}

1) Що значить наступний кусок коду:

struct Visitor : B...

який тиg буде мати B?
2) Що це таке?

using B::operator()...;

3) Що за цікавий конструктор.

template<typename ... T>
Visitor(T...) -> Visitor<std::decay_t<T>...>;
Подякували: 0x9111A1

2

Re: Незрозумілий синтаксис в С++17

Lokki написав:

1) Що значить наступний кусок коду:

struct Visitor : B...

Що Visitor є нащадком всіх типів, якими параметризований.

Lokki написав:

який тиg буде мати B?

Наприклад, int, std::string, void (*)(). Уточнюю: це не варіанти, а одна відповідь. Щоправда, якщо B буде таким, то, гадаю, код не скомпілюється - бо не можна успадковуватися від int.

Lokki написав:

2) Що це таке?

using B::operator()...;

Visitor використовує оператор дужки від усіх предків.

Lokki написав:

3) Що за цікавий конструктор.

template<typename ... T>
Visitor(T...) -> Visitor<std::decay_t<T>...>;

Це не конструктор, у нього є тип, який він повертає. Прототип функції.

І мені здається, що це не C++17, а навіть C++11...

Подякували: LoganRoss1