Мне хотелось бы написать некий шаблонный метод, который инстанцируется только в случае наличия другого метода перегруженного для подставляемого параметра. Пример:
template<typename Type>
auto Func(Type first) -> declspec(TagFunc(first))
{
return TagFunc(first);
}
Проблема: TagFunc внутри метода, если нужно, ищется с использованием ADL, но уже внутри declspec ADL не подчиняется и в случае вызова из другого пространства имен auto не может определить тип возвращаемого параметра.
Вопросы:
1. Это глюки, не достаточная поддержка С++11 у 2013-ой студии?
2. Это поведение по стандарту и так и должно быть?
Если приведенный код не рабочий, то можно ли тут что-то сделать?
Здравствуйте, 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