2012-06-18 19 views
5

Tengo una función implementada MyFunc(int, double, string) en mi proyecto. ¿Cómo puedo llamar a esta función con los parámetros necesarios que tiene su representación de cadena, por ejemploConvierte std :: cadena a función existente con parámetros en C++

std::string str = "MyFunc(2, 3.12, \"Lemon Juice\")"; 

Y qué pasa con las funciones estándar, por ejemplo, ¿cómo puedo llamar time() tener std::string "time()"?


Bien, aquí hay una tarea más detallada. Tengo map <string, Data> Data es una envoltura de clase con muchos hijos. Cuando llamo al método Data.GetValue(), devuelve un std::string, dependiendo de los datos internos de la clase secundaria. Uno de Data childs debe devolver la representación de cadena de int, otra - la representación de cadena de double, y la última - la representación de cadena de fecha y hora actual. Aquí está el problema: no sé cómo llamar a la función estándar ctime() para obtener información de uno de los Data niños.

+0

No es fácil. ¿Desea poder llamar a la función * any *, o solo a algunas específicas? – BoBTFish

+1

Esa es la principal aplicación para el lenguaje de scripting. Muchos lenguajes de scripting también se integran bastante bien con C++, eche un vistazo a LUA, por ejemplo. – smerlin

+1

¿Para qué necesitas esto? Como otros han comentado, esto es muy, muy difícil. Probablemente haya alternativas más fáciles para lo que necesita. –

Respuesta

3

No se puede en general ejecutar código en C++ cuyo origen está contenido en una cadena. Probablemente la motivación más convincente para esto es que no se requiere una implementación de C++ para tener un compilador de C++ en la máquina en la que se ejecuta el código, aunque hay más que eso.

Es posible que pueda hacerlo para casos específicos. Eso podría ser:

plataforma específica, por ejemplo:

  • Wrap la fuente en algún repetitivo, entonces o bien llamar al compilador externamente, enlace en contra de ella, o incrustarla en su programa. Esto te da un programa o biblioteca.
  • Ejecute ese nuevo programa externamente o enlace dinámicamente con esa biblioteca.

entrada específica, por ejemplo:

  • Se podría analizar una llamada de función a una función particular conocido, con literales como argumentos, con relativa facilidad sin necesidad de un C++ compilador completa. Obtenga los valores del argumento en variables y llame a la función. Pero si va a hacer eso, puede especificar un formato más fácil de analizar para la cadena, que uno que se parece a una llamada de función C++.

Suena como si en su tarea que tiene una cadena que es uno de:

  • una representación de un int
  • una representación de un double
  • una representación de una fecha y hora.

No dice lo que quiere hacer con esta cuerda, pero sea lo que sea, probablemente necesite (a) examinar la cadena para averiguar cuál de las tres es, y luego (b) hacer algo apropiado para ese formato.Mejor, podría otorgarle a la clase derivada la responsabilidad de devolver la misma representación sin importar cuál de las tres devuelve GetValue(). Por ejemplo, si lo que realmente desea son los segundos desde 1970, agregue una función GetSecondsSinceEpoc e impleméntela de manera diferente en cada clase.

0

No puede hacer eso con C++.

+2

Aunque más o menos (hay * bibliotecas * de scripts en C++) precisas, esto no es realmente útil ... –

+4

Por supuesto que puede hacer eso, solo necesita escribir un analizador sintáctico que traduzca esas cadenas en llamadas. Tenemos una biblioteca en mi empresa que hace esto para cientos, tal vez miles de funciones de la biblioteca. – PlasmaHH

+0

¿Alguna fuente de código abierto que pueda usar en mi casa? o proyectos locales? – elcuco

1

Según lo mencionado por otros, C++ en sí mismo no puede hacer eso. Sin embargo, los marcos externos pueden ayudarte.

ROOT (utilizado en CERN) proporciona reflexión para C++ junto con un intérprete. Podrá ejecutar/interpretar una llamada a un método o una macro escrita en C++ desde su código.

+0

El sitio web de ROOT se ha caído debido a problemas de seguridad encontrados por el equipo de seguridad informática, debería volver pronto ... – Barth

Cuestiones relacionadas