Повышение Перегрузка странное поведение .. чем `int (int), int (std :: string)` отличается от `int (int), int (std :: string), std :: string (std :: string)`? - PullRequest
0 голосов
/ 02 декабря 2011

Итак, есть замечательная библиотека с именем OverLoad (ссылка на загружаемый каталог svn, lib только для заголовка) .он может принимать функции любых типов и автоматически решать, какой из них вы вызываете.Это как функция повышения, но лучше.Вот 2 примера кода (браузер может просматривать boost svn) one two .и вот мой код, который не компилируется и основан на них:

#include <string>

#include <boost/detail/lightweight_test.hpp>

#include <boost/overload.hpp>

using boost::overload; 

template<class out, class in>
out foo(in O )
{
    std::cout << "yes we can!";
    return out();
}

int main()
{
    //// works
    //overload<int (int ), int (std::string )> f;
    //// works
    //int (*foo1) (int ) = &foo<int, int>;
    //int (*foo2) (std::string ) = &foo<int, std::string>;
    //f.set(foo1);
    //f.set(foo2);
    // or we can use
    //// does also work
    //f.set<int (int )>(&foo<int, int>);
    //f.set<int (std::string )>(&foo<int, std::string>);
    ////

    overload<int (int ), int (std::string ), std::string (std::string) > f;
    //// but when we do this
    //f.set<int (int )>(&foo<int, int>);
    //f.set<int (std::string )>(&foo<int, std::string>);
    //f.set<int (std::string )>(&foo<std::string, std::string>);
    //// or this:
    int (*foo1) (int ) = &foo<int, int>;
    int (*foo2) (std::string ) = &foo<int, std::string>;
    std::string (*foo3) (std::string ) = &foo<std::string, std::string>;
    f.set(foo1);
    f.set(foo2);
    f.set(foo3);
    //// we get compile error

    BOOST_ASSERT( f(0) == 1 );
    BOOST_ASSERT( f("hi") == 2 ); // here we get Error  1   error C3066: there are multiple ways that an object of this type can be called with these arguments

    return boost::report_errors();
}

Так что мне интересно, как обойти эту проблему?

1 Ответ

1 голос
/ 02 декабря 2011

Разрешение перегрузки учитывает только типы параметров; он не учитывает тип возвращаемого значения. Таким образом, при разрешении перегрузки int (std::string) неотличимо от std::string(std::string).

Поскольку этой библиотеке приходится полагаться на возможности перегрузки языка C ++, она также не может различить две функции.

...