Я пытаюсь выяснить более чистый способ написания этого довольно уродливый код:Сжато переписать набор функций с переменным числом аргументов
class PythonExtensionBase : public PyObject
{
:
public:
// helper functions to call function fn_name with 0 to 9 args
Object callOnSelf(const std::string &fn_name);
Object callOnSelf(const std::string &fn_name, const Object &arg1);
Object callOnSelf(const std::string &fn_name, const Object &arg1, const Object &arg2);
Object callOnSelf(const std::string &fn_name, const Object &arg1, const Object &arg2, const Object &arg3);
:
(вплоть до 9)
Эти функции реализуются в соответствующем .cxx:
Py::Object PythonExtensionBase::callOnSelf(const std::string &fn_name)
{
Py::TupleN args;
return self().callMemberFunction(fn_name, args);
}
Py::Object PythonExtensionBase::callOnSelf(const std::string &fn_name,
const Py::Object &arg1)
{
Py::TupleN args(arg1);
return self().callMemberFunction(fn_name, args);
}
Py::Object PythonExtensionBase::callOnSelf(const std::string &fn_name,
const Py::Object &arg1, const Py::Object &arg2)
{
Py::TupleN args(arg1, arg2);
return self().callMemberFunction(fn_name, args);
}
Py::Object PythonExtensionBase::callOnSelf(const std::string &fn_name,
const Py::Object &arg1, const Py::Object &arg2, const Py::Object &arg3)
{
Py::TupleN args(arg1, arg2, arg3);
return self().callMemberFunction(fn_name, args);
}
:
Эффективно задача обобщить:
X(A a, B b1, B b2, B b3) {
foo(b1, b2, b3);
}
Я вижу, что вариационный шаблон - это, вероятно, путь, но я изо всех сил пытаюсь понять, как его использовать.
Этот класс TupleN определяется следующим образом:
class TupleN: public Tuple
{
public:
TupleN()
: Tuple(0)
{
}
TupleN(const Object &obj1)
: Tuple(1)
{
setItem(0, obj1);
}
TupleN(const Object &obj1, const Object &obj2)
: Tuple(2)
{
setItem(0, obj1);
setItem(1, obj2);
}
TupleN(const Object &obj1, const Object &obj2, const Object &obj3)
: Tuple(3)
{
setItem(0, obj1);
setItem(1, obj2);
setItem(2, obj3);
}
:
virtual ~TupleN()
{ }
};
Я искренне надеюсь, что единственная причина, это не потому, что автор изначально не имел наличие возможностей C++ 11. Если это действительно так, и проблема с тех пор была решена, многие из них действительно могут быть пересмотрены для вариативного решения. – WhozCraig
В качестве альтернативы варианту решения вы можете использовать 'std :: initializer_list