Проблема с ADL
От: Videoman Россия https://hts.tv/
Дата: 23.05.18 07:11
Оценка:
Мне хотелось бы написать некий шаблонный метод, который инстанцируется только в случае наличия другого метода перегруженного для подставляемого параметра. Пример:
template<typename Type>
auto Func(Type first) -> declspec(TagFunc(first))
{
    return TagFunc(first);
}

Проблема: TagFunc внутри метода, если нужно, ищется с использованием ADL, но уже внутри declspec ADL не подчиняется и в случае вызова из другого пространства имен auto не может определить тип возвращаемого параметра.
Вопросы:
1. Это глюки, не достаточная поддержка С++11 у 2013-ой студии?
2. Это поведение по стандарту и так и должно быть?

Если приведенный код не рабочий, то можно ли тут что-то сделать?
Отредактировано 23.05.2018 7:12 Videoman . Предыдущая версия .
Re: Проблема с ADL
От: vopl Россия  
Дата: 23.05.18 08:06
Оценка: 4 (1)
Здравствуйте, Videoman, Вы писали:

V>Мне хотелось бы написать некий шаблонный метод, который инстанцируется только в случае наличия другого метода перегруженного для подставляемого параметра. Пример:

V>
V>template<typename Type>
V>auto Func(Type first) -> declspec(TagFunc(first))
V>{
V>    return TagFunc(first);
V>}
V>

V>Проблема: TagFunc внутри метода, если нужно, ищется с использованием ADL, но уже внутри declspec ADL не подчиняется и в случае вызова из другого пространства имен auto не может определить тип возвращаемого параметра.
V>Вопросы:
V>1. Это глюки, не достаточная поддержка С++11 у 2013-ой студии?
V>2. Это поведение по стандарту и так и должно быть?

V>Если приведенный код не рабочий, то можно ли тут что-то сделать?


не воспроизводится

#include "stdafx.h"

namespace ns1
{
    struct V{};
    struct R{};

    R TagFunc(V) { return R{}; }
}

namespace ns2
{
    struct V{};
    struct R{};

    R TagFunc(V) { return R{}; }
}

template<typename Type>
auto Func(Type first) -> decltype(TagFunc(first)) // declspec??
{
    return TagFunc(first);
}

////////////////////////////////////////////////////
namespace ns1
{
    int main()
    {
        ns1::R r1 = Func(ns1::V{});
        ns2::R r2 = Func(ns2::V{});

        return 0;
    }
}

namespace ns2
{
    int main()
    {
        ns1::R r1 = Func(ns1::V{});
        ns2::R r2 = Func(ns2::V{});

        return 0;
    }
}

namespace another
{
    int main()
    {
        ns1::R r1 = Func(ns1::V{});
        ns2::R r2 = Func(ns2::V{});

        return 0;
    }
}

int main()
{
    ns1::R r1 = Func(ns1::V{});
    ns2::R r2 = Func(ns2::V{});

    return 0;
}


1>------ Build started: Project: ConsoleApplication1, Configuration: Debug Win32 ------
1>  ConsoleApplication1.cpp
1>  ConsoleApplication1.vcxproj -> c:\tmp\ConsoleApplication1\Debug\ConsoleApplication1.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========


Microsoft Visual Studio Express 2013 for Windows Desktop
Version 12.0.21005.1 REL
Microsoft .NET Framework
Version 4.6.01055

Installed Version: Desktop Express

Team Explorer for Visual Studio 2013   06157-004-0441005-02584
Microsoft Team Explorer for Visual Studio 2013

Visual Basic 2013   06157-004-0441005-02584
Microsoft Visual Basic 2013

Visual C# 2013   06157-004-0441005-02584
Microsoft Visual C# 2013

Visual C++ 2013   06157-004-0441005-02584
Microsoft Visual C++ 2013

NuGet Package Manager   2.7.40911.287
NuGet Package Manager in Visual Studio. For more information about NuGet, visit http://docs.nuget.org/.

SQL Server Data Tools   12.0.30919.1
Microsoft SQL Server Data Tools
Re[2]: Проблема с ADL
От: Videoman Россия https://hts.tv/
Дата: 23.05.18 09:08
Оценка:
Здравствуйте, vopl, Вы писали:

Извиняюсь, decltype конечно.
Спасибо — исчерпывающе. Так действительно работает. На боевом коде всё усугубляется длинной простыней ошибок в которой я видимо запутался. Буду проверять.
Отредактировано 23.05.2018 9:55 Videoman . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.