Nombre de la función de plantilla en términos de argumento de plantilla

He estado buscando ejemplos relacionados con el tema de mi pregunta y todavía no puedo encontrar una solución. Lo más cercano que he encontrado es

Función de plantilla como argumento de plantilla.

Intentaré publicar un ejemplo de trabajo en caso de que sea necesario, pero hasta ahora parte de mi código incluye lo siguiente:

template<class InterfaceType, class T> 
inline void write_info(InterfaceType& interface, T& t) {
    InterfaceType::write_info(interface, t);
}

template<class InterfaceType, class T> 
inline void write_data(InterfaceType& interface, T& t) {
    InterfaceType::write_data(interface, t);
}

template<class InterfaceType, class T> 
inline void write_definition(InterfaceType& interface, T& t) {
    InterfaceType::write_definition(interface, t);
}

Tenga en cuenta que las plantillaswrite_info Depende de un tipo de interfaz que tenga un método llamadowrite_info (Un método estático). La razón por la que se hace esto es porque lawrite_info La función puede especializarse más adelante para un tipo de datos específico sin tener que redefinir nada en elInterfaceType.

La pregunta simple es: ¿podemos reducir el código anterior con una plantilla que nombre la función como un parámetro de función? Tenga en cuenta que realmente quiero que esto sea posible para evitar la definición de esas 3 funciones para un tipo de datos especializado, es decir,

Suponer quefoo Es una estructura con dos atributos.int a ydouble b. Entonces puedo especializar las funciones anteriores de esta manera:

template<class InterfaceType> 
inline void write_info(InterfaceType& interface, foo& t) {
    InterfaceType::write_info(interface, t.a);
    InterfaceType::write_info(interface, t.b);
}

template<class InterfaceType> 
inline void write_data(InterfaceType& interface, foo& t) {
    InterfaceType::write_data(interface, t.a);
    InterfaceType::write_data(interface, t.b);
}

template<class InterfaceType> 
inline void write_definition(InterfaceType& interface, foo& t) {
    InterfaceType::write_definition(interface, t.a);
    InterfaceType::write_definition(interface, t.b);
}

Como puedes ver, estoy escribiendo el mismo código una y otra vez. Aquí supongo que el tipo de interfaz ya tiene definidowrite_info, write_data ywrite_definition paraint ydouble. ¿Algunas ideas?

Respuestas a la pregunta(1)

Su respuesta a la pregunta