env->CallObjectMethod(hashMapInstance, put, _, _)
Я хочу вызвать эту функцию со всеми возможными перестановками std::string
, int
, double
на подчеркиваниях. Например:
env->CallObjectMethod(hashMapInstance, put, myString, myInt)
env->CallObjectMethod(hashMapInstance, put, myInt, myDouble)
env->CallObjectMethod(hashMapInstance, put, myInt, myInt)
//...
Конечно, я могу сделать это с помощью вложенных ifs, но я буду многократно использовать один и тот же код во многих местах. В идеале я хотел бы получить способ std::map<JavaObject, JavaObject> myMap
, а затем для каждой пары на карте сделать следующее:
for (auto pair : myMap)
if (pair.first.type == JavaObject::String && pair.second.type == JavaObject::Integer)
env->CallObjectMethod(hashMapInstance, put, pair.first.getString(), pair.second.getInt())
//OR
if (pair.first.type == JavaObject::Integer && pair.second.type == JavaObject::Integer)
env->CallObjectMethod(hashMapInstance, put, pair.first.getInt(), pair.second.getInt()) //
//OR
if (pair.first.type == JavaObject::Double && pair.second.type == JavaObject::String)
env->CallObjectMethod(hashMapInstance, put, pair.first.getDouble(), pair.second.getString())
//...
, как вы видите, мне нужен способ, чтобы эффективно звонитькаждая перестановка env->CallObjectMethod(hashMapInstance, put, _, _)
для каждой возможной перестановки из JavaObject, JavaObject
получено (JavaObject
- это просто класс, который может содержать string
, int
, double
и, возможно, больше в будущем)
Первым делом я подумал о создании шаблонной функции:
template<typename T, typename V>
void myCallobjectMethod(env, jobject instance, jmethodID method, T obj1, V obj2)
Но мне все равно нужно прочитать JavaObject.type
для первого элемента, а затем внутри этого if, сделать другое if для второй части, просто вызватьмоя шаблонная функция, так что я все еще с той же проблемой.
Я подумал о другом способе, в псевдокоде:
using namespace std::placeholders;
for (auto pair : myMap)
auto bind1 = std::bind(env->CallObjectMethod, hashMapInstance, put, _3, _4); //binds the hashMapInstance and put
auto bind2 = std::bind(bind1, pair.first, _2); //binds the first object
auto bind3 = std::bind(bin2, pair.second); //binds the second object
bind3(); //now I can call bind3 to execute the call
но это не так просто, я даже не знаючто происходит с типами вещей здесь.