概念:需要类型上的函数,而不默认构造该类型

Mat*_*phy 0 c++ templates c++-concepts c++20

我需要要求某种类型 A 存在一个函数 f(A, A::B)。

我正在通过使用 A 和 A::B 的实例调用 f 来测试这一点。是否有一种不那么招摇的方法来测试依赖类型的实例而不需要默认可构造?

template <class Container>
concept CanPutData = requires (Container a)
{
  //put(typename Container::data_type{}, a);  // overconstrained
  put(*reinterpret_cast<typename Container::data_type*>(0), a); // oof
};

void test(CanPutData auto container) {}

template<class Container>
void put(typename Container::data_type const& data, Container& into) {}


template<class Data>
struct data_container { using data_type = Data; };
struct not_default_constructible_data { int& v; };

int main()
{
  test(data_container<not_default_constructible_data>{});

  return 0;
}

Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 6

同样的方式,你已经得到了一个,Container而不要求它是默认可构造的:只需将它粘贴到需要表达式的参数列表中:

template <class Container>
concept CanPutData = requires (Container container, typename Container::data_type data)
{
  put(data, container);
};
Run Code Online (Sandbox Code Playgroud)