Можно ли отключить вызов именованного аргумента?

У меня есть две подпрограммы, разница которых только в порядке аргументов, но я хотел бы использовать их через интерфейс, чтобы при вызове вызывалась правильная в соответствии с порядком аргументов. Компилятор жалуется, что не может их различить, и я предполагаю, что если я использую синтаксис для именованных аргументов при вызове, он не будет знать, какой из них вызывать. Одним из обходных путей было бы использование разных имен для аргументов, но мне было интересно, есть ли способ отключить стиль вызова именованных аргументов.

Пример, это ситуация, которую я пытаюсь обработать

module Foo

    interface Bar
        module procedure Bar1
        module procedure Bar2
    end interface

contains
    subroutine Bar1(i,r)
        integer, intent(in) :: i
        real, intent(in) :: r
        print *, "bar1"
    end subroutine
    subroutine Bar2(r,i)
        real, intent(in) :: r
        integer, intent(in) :: i
        print *, "bar2"
    end subroutine

end module

program fuux
    use Foo
    integer :: i
    real :: r

    r = 5.0
    i = 3

    call Bar(i,r) ! note that if I call Bar(i=i, r=r) the compiler cannot disambiguate
                  ! so it will complain at the interface statement
end program

person Stefano Borini    schedule 19.04.2012    source источник
comment
Вы определили причину правильно cs.rpi.edu/~szymansk/OOF90 /bugs.html#10   -  person Vladimir F    schedule 19.04.2012


Ответы (1)


Я не знаю, как сделать то, что вы предлагаете, или, скорее, сделать то, что, как я думаю, вы предлагаете во фразе «отключить стиль вызова именованного аргумента». Если этот ответ каким-то образом разозлит, разочарует или вызовет недовольство, опубликуйте какой-нибудь код, и мы (т.е. я имею в виду, что у меня не слишком много манер и граций и я редко использую королевское «мы»), возможно, сможем предложить хитрый трюк, который понравится ты.

ИЗМЕНИТЬ

На ум не приходит прямого способа сделать то, что вы хотите сделать. Первый обходной путь, который приходит мне в голову, — определить подпрограмму с именем bar, которая принимает ряд аргументов в каноническом порядке и просто вызывает bar1, bar2 (и любой другой дочерний элемент bars, который вы хотите определить) с аргументами в соответствующем порядке.

person High Performance Mark    schedule 19.04.2012
comment
если вы переносите, то bar нужно будет принять два аргумента варианта типа integer or real :: ir, проанализировать их тип и вызвать соответствующий BarN, что невозможно в фортране. Эта проблема возникает из-за одновременного наличия статической типизации и именованных аргументов. И C++, и Java избегают именованных аргументов, вероятно, по этой причине. - person Stefano Borini; 19.04.2012
comment
О, это намного умнее, чем я думал Стефано, я думал, что bar будет иметь целое число и вещественный аргумент и будет передавать их bar1 и bar2 в том порядке, в котором хотят эти подпрограммы. Но вы можете проанализировать тип аргумента в Фортране, если вы объявите его неограниченно полиморфным (т.е. class(*)), а затем установите конструкцию select type. Я не предлагаю вам это делать, заметьте. - person High Performance Mark; 19.04.2012