Существует два вида reflection
плавание вокруг.
template-tricks
. Используйте boost::type_traits
для многих вещей (как проверка, является ли тип неотъемлемой частью). Для проверки существование функции членства используйте , он возможный записать шаблон для проверки на function' s существование? . Для проверки, существует ли определенный вложенный тип, используйте плоскость SFINAE. , Если Вы скорее ищете способы выполнить 1), как взгляд, сколько методы класс имеют, или как получение строкового представления идентификатора класса, тогда я боюсь, что нет никакого Стандартного C++ способа сделать это. Необходимо использовать любой
C++ сделан со скоростью в памяти. Если Вы хотите высокоуровневый контроль, как C#, или Java имеет, то я боюсь, что должен сказать Вам, что нет никакого пути без некоторого усилия.
Мне просто повезло с этим постом: http://www.thismuchiknow.co.uk/?p=71
Здесь демонстрируется функция sqlite, которая принимает один строковый параметр и возвращает строковый результат.
В вашем случае вам понадобится функция, которая считывает четыре числа с плавающей запятой и возвращает число с плавающей запятой, но принцип тот же (вы должны заменить sqlite3_value_text на sqlite3_value_double и sqlite3_result_text с sqlite3_result_double ):
#include <stdlib.h>
#include <sqlite3.h>
#include <stdio.h>
void haver(sqlite3_context* ctx,int cnt,sqlite3_value** val)
{
printf("In SQLite haver implementation, called for value: %s\n", sqlite3_value_text(*val));
char * resultOfCall = "Result of function call"; //this would call the distance function
sqlite3_result_text(ctx, resultOfCall, strlen(resultOfCall), NULL);
}
int cback (void* udata,int ncol,char** value,char** colname)
{
int i=0;
for(;i<ncol;i++)
printf("Result column: %s value: %s \n", colname[i], value[i]);
return 0;
}
int main()
{
sqlite3 * handle;
int res = sqlite3_open("./test.sql", &handle);
res = sqlite3_create_function(handle, "haver", 1, SQLITE_UTF8, NULL, &haver, NULL, NULL);
char * errmsg = NULL;
res = sqlite3_exec(handle, "select haver(w) from t", &cback, NULL, &errmsg);
printf("sqlite3_exec result: %d %s\n", res, errmsg != NULL ? errmsg : "No error");
sqlite3_close(handle);
}