LINUX.ORG.RU

Как протащить из С++11 в python через swig2 или swig1.xx метод с аргументом && ?

 , ,


0

3

Сабж. swig3.0 такое умеет из коробки, но он не везде есть увы;-( Старый swig дает ошибку синтаксиса.

Речь идет о компиляции че то вроде

void foo(MyClass &&x){ ... }

Метод нужен в питоне.

Можно попытаться заигнорить для свига исходный метод через #ifndef SWIG и завернуть его во что то типа

void foo(MyClass &x){ ... }
но я че то не соображу как это Ъ сделать и к чему это вообще приведет... ;-(

★★★★★

А когда третий swig используешь для этого, в питоне семантика перемещения игнорируется? (Пардон, лень гуглить).

WizardOfOz
()

никак. или патчи свиг руками, чтоб умел.

anonymous
()
Ответ на: комментарий от WizardOfOz

«Rvalue references are designed for C++ temporaries and so are not very useful when used from non-C++ target languages.»

http://www.swig.org/Doc3.0/CPlusPlus11.html#CPlusPlus11_rvalue_reference_and_...

Ну в общем там и так в системе типов свига трэш, угар и содомия... оно будет наверное несколько загадочно работать;-)

AIv ★★★★★
() автор топика

Можно попытаться заигнорить для свига исходный метод через #ifndef SWIG и завернуть его во что то типа

В const MyClass& x, тогда.

Алсо, ты уверен, что MyClass - это не темплейтный параметр? Для них другая семантика && (universal reference).

Kuzy ★★★
()
Ответ на: комментарий от Kuzy

В const MyClass& x, тогда.

Не-а

struct MyClass{};

#ifndef SWIG
void h(MyClass &&x){
#else
void h(const MyClass &x){
#endif
}
test_wrap.cxx:3177:31: error: invalid initialization of reference of type ‘MyClass&&’ from expression of type ‘const MyClass’
       h((MyClass const &)*arg1); 
                               ^
In file included from test_wrap.cxx:3039:0:
test.hpp:9:6: error: in passing argument 1 of ‘void h(MyClass&&)’
 void h(MyClass &&x){
      ^

Алсо, ты уверен, что MyClass - это не темплейтный параметр? Для них другая семантика && (universal reference).

В интересующем меня случае - не темплейтный.

AIv ★★★★★
() автор топика
Ответ на: комментарий от Kuzy

Да, туплю. Так что ли?

#ifndef SWIG
void foo(MyClass &&x){
}
#endif

void foo(MyClass &x){
	foo(std::move(x));
}

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.