Как изменить тип переменной внутри вариативного шаблона?
Как изменить тип переменой внутри данного шаблона: template <typename... Args>?
Например если передали string "str" то поменять на jstring "str" (Функция конвертора написана)
Стоит задача написать удобную обертку для вызова JNI из C++. Вызов самой функции:
CallJni("com/NameCompany/NameProject/NameClass", "NameFunction", "Str for JNI", 0.f, 1.f, 2.f);
Хедер самой функции:
template <typename... Args>
static void CallJni(const char* ClassName, const char* FunctionName, Args... args)
Как можно параметры args... переконвертировать в самой функции CallJni в зависимости от их типа (string, int, float...) и передать дальше все тем же вариативным шаблоном? Были идеи через указатель и static_cast, но только вообще без понятие как это реализовать.
Палки в колеса вставляет то что собирается это дело на:
NDK toolchain: r14b, GccVersion: 4.9, ClangVersion: 3.8.275480
Поддержка c++11 не полная у данного NDK
Всю остальную обертку я написал, и если "Str for JNI" предварительно переконвертировать в jstring GetJavaString("Str for JNI"), то функция отлично работает
Ответы (2 шт):
Легко: делаете перегруженную функцию, преобразующую аргументы в нужные типы:
template <typename T>
const T &convertArg(const T &value) {return value;}
jstring ConvertArg(const char *str) {return /*...*/;}
А потом в теле CallJni меняете args... на ConvertArg(args)....
Вот пример на коленке:
#include <iostream>
#include <string>
using namespace std;
class JStr {
public:
std::string str;
JStr(std::string str): str(str) {}
friend std::ostream& operator<< (std::ostream& stream, const JStr& self) {
return stream << "JStr(" << self.str << ")";
}
};
template <class T> auto convert(T a) {return a;}
template <> auto convert(string a) {return JStr(a);}
template <typename... TArgs>
static void foo(TArgs... args) {
int dummy[sizeof...(TArgs)] = { (std::cout << convert(args) << ", ", 0)... };
}
int main(int argc, char const *argv[])
{
int a{1};
string b{"Hello"};
foo(a, b);
return 0;
}