Предположим, что я хочу сделать «контейнер», который хранит дженерик данные и в определённые моменты «валидировать» их:
struct Container<Data, Validate: Fn(&Data) -> bool> { ... }
PhantomData
:
struct Container<Data, Validate: Fn(&Data) -> bool> {
data: Vec<Data>,
validate: PhantomData<Validate>,
}
Во первых, хочется иметь дефолтное значение, но написать struct Container<Validate: Fn(&Data) -> bool = foo>
нельзя - ведь функция это значение, а не тип.
Во вторых, как это использовать? PhantomData
только в качестве маркеров и пригодно?
В общем, можно ли как-то вообще извернуться или функцию всё-таки придётся хранить в объекте?
На плюсах (просьба не реагировать как на красную тряпку - просто для иллюстрации) это могло бы выглядеть как-то так:
bool foo(int) { return false; }
template <bool (*f)(int) = foo>
struct S {
bool foo() { f(10); }
};