Информация об изменениях

Сообщение Re[2]: variadic от 25.09.2023 12:27

Изменено 25.09.2023 12:28 Sm0ke

Re[2]: variadic
Здравствуйте, Sm0ke, Вы писали:

Попробовал этот трюк провернуть с вариадиками, но что-то пошло не так: https://godbolt.org/z/9rdGfzn76

#include <type_traits>
#include <iostream>

  template <typename Type, typename ... U>
  concept c_any_of = (std::is_same_v<Type, U> || ...);

template <typename ... T>
struct restricted
{
  template <c_any_of<T ...> U>
  friend void U::go(const restricted &) const;
private:
  int value{55};
};

struct agent_A
{
  template <typename T>
  void go(const T & r) const
  {
    std::cout << "A: " << r.value << '\n'; // fail
  }
};

struct agent_B
{
  template <typename T>
  void go(const T & r) const
  {
    std::cout << "B: " << r.value << '\n';
  }
};

int main()
{
  restricted<agent_A, agent_B> v;
  agent_A a;
  agent_B b;
  a.go(v);
  b.go(v);
  return 0;
}
Re[2]: variadic
Здравствуйте, Sm0ke, Вы писали:

ради эксперимента
Попробовал этот трюк провернуть с вариадиками, но что-то пошло не так: https://godbolt.org/z/9rdGfzn76

#include <type_traits>
#include <iostream>

  template <typename Type, typename ... U>
  concept c_any_of = (std::is_same_v<Type, U> || ...);

template <typename ... T>
struct restricted
{
  template <c_any_of<T ...> U>
  friend void U::go(const restricted &) const;
private:
  int value{55};
};

struct agent_A
{
  template <typename T>
  void go(const T & r) const
  {
    std::cout << "A: " << r.value << '\n'; // fail
  }
};

struct agent_B
{
  template <typename T>
  void go(const T & r) const
  {
    std::cout << "B: " << r.value << '\n';
  }
};

int main()
{
  restricted<agent_A, agent_B> v;
  agent_A a;
  agent_B b;
  a.go(v);
  b.go(v);
  return 0;
}