Я получаю ошибку SFINAE со следующим кодом, поскольку он не будет использовать шаблон. Я пытаюсь усовершенствовать арги в результате. Любые идеи кто-нибудь.
#include <iostream>
#include "constants.h"
namespace perfectforwarding
{
template<class T, class U>
constexpr auto maximum(T&& a, U&& b) -> decltype( (a > b) ? std::forward(a) : std::forward(b))
{
return (a > b) ? std::forward(a) : std::forward(b);
}
}int main(int argc, const char * argv[])
{
std::cout << "Created count is: " << created_count << std::endl;
auto const result = perfectforwarding::maximum(5,6.0);
std::cout << "The maximum of 5 and 6: " << result << std::endl;
return 0;
}
блэр
std::forward
является шаблоном, и вам нужно явно указать аргумент типа, если вы хотите, чтобы он работал правильно. Вот как твоя maximum
Шаблон функции должен быть переписан:
template<class T, class U>
constexpr auto maximum(T&& a, U&& b) ->
decltype( (a > b) ? std::forward<T>(a) : std::forward<U>(b))
{
return (a > b) ? std::forward<T>(a) : std::forward<U>(b);
}
Вот как std::forward
Утилита определяется:
template<class T>
T&& forward(typename remove_reference<T>::type& a) noexcept
{
return static_cast<S&&>(a);
}
Выражение typename remove_reference<T>::type
делает это не выводимым контекстом, который объясняет, почему вывод типа завершается неудачей, если вы явно не предоставили аргумент типа T
,
Других решений пока нет …