puntero de función parametrizado constexpr

puntero de función parametrizado constexpr

Más o menos.

esto:

obj1->ComputeStatistics(getHistogramLambda("obj1"));

No funcionará por las razones que señala:necesita capturar el estado. Y luego, no podemos escribir esto:

obj1->ComputeStatistics(getHistogramLambda<"obj1">());

Porque si bien podemos tener parámetros de plantilla de tipo const char* no podemos hacer que se unan a cadenas literales. podrías hazlo de esta manera:

template <const char* name>
constexpr auto getHistogramLambda() {
    return [](const auto& v) {return histogram(name, v);};
}

const char p[] = "obj1";
obj1->ComputeStatistics(getHistogramLambda<p>());

Lo cual es bastante incómodo porque necesita introducir la variable adicional para cada invocación. En C++20, podremos escribir un tipo de clase que tenga como parámetro de plantilla una cadena fija, lo que permitirá getHistogramLambda<"obj1"> para trabajar, solo que de una manera ligeramente diferente.

Hasta entonces, la mejor manera actualmente es probablemente usar un UDL para capturar los caracteres individuales como parámetros de plantilla de algún tipo de clase:

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));

La intención aquí es que "obj"_udl es un objeto de tipo X<'o', 'b', 'j', '1'> - y luego reconstruimos la cadena dentro del cuerpo de la plantilla de función de una manera que aún no requiere captura.

¿Vale la pena esto para evitar la duplicación? Quizás.