Сортировка.
Это:
obj1->ComputeStatistics(getHistogramLambda("obj1"));
Не сработает по указанным вами причинам - вам нужно зафиксировать состояние. И потом, мы не можем написать это:
obj1->ComputeStatistics(getHistogramLambda<"obj1">());
Поскольку у нас могут быть параметры шаблона типа const char*
, мы не можем связывать их со строковыми литералами. Вы могли бы сделать это так:
template <const char* name>
constexpr auto getHistogramLambda() {
return [](const auto& v) {return histogram(name, v);};
}
const char p[] = "obj1";
obj1->ComputeStatistics(getHistogramLambda<p>());
Что довольно неудобно, потому что вам нужно вводить дополнительную переменную для каждого вызова. В C ++ 20 мы сможем написать тип класса, который имеет в качестве параметра-шаблона фиксированную строку, которая позволит getHistogramLambda<"obj1">
работать, немного по-другому.
До тех пор лучшим способом в настоящее время, вероятно, является использование UDL для захвата отдельных символов в качестве параметров шаблона некоторого типа класса:
template <char... Cs>
constexpr auto getHistogramLambda(X<Cs...>) {
static constexpr char name[] = {Cs..., '\0'};
return [](const auto& v) { return histogram(name, v);};
}
obj->ComputeStatistic(getHistogramLambda("obj1"_udl));
Намерение здесь состоит в том, что "obj"_udl
является объектом типа X<'o', 'b', 'j', '1'>
- и затем мы восстанавливаем строку в теле шаблона функции таким образом, что по-прежнему не требуется захват.
Стоит ли этого избегать дублирования? Может быть.