Как изменить тип переменной внутри вариативного шаблона?

Как изменить тип переменой внутри данного шаблона: 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 шт):

Автор решения: HolyBlackCat

Легко: делаете перегруженную функцию, преобразующую аргументы в нужные типы:

template <typename T>
const T &convertArg(const T &value) {return value;}

jstring ConvertArg(const char *str) {return /*...*/;}

А потом в теле CallJni меняете args... на ConvertArg(args)....

→ Ссылка
Автор решения: vp_arth

Вот пример на коленке:

#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;
}
→ Ссылка