Я пытаюсь написать обобщенную c функцию с аргументом, который содержит несколько преобразований для типа шаблона, например:
#include <iostream>
#include <string>
#include <type_traits>
template< typename _T_ >
void foo
(
const std::basic_string< typename std::remove_cv< typename std::remove_extent< _T_ >::type >::type > & str
)
{
std::cout << str << std::endl;
}
int main( void )
{
foo< char const [ 3 ] >( "abc" ); // OK
foo( "abc" ); // Cannot deduce template argument
return 0;
}
К сожалению, компилятор не может вывести правильный тип .
Протестировано с последними версиями Clang, G CC и MSV C.
Интересно, что компилятор может вывести одно преобразование:
const std::basic_string< typename std::remove_extent< _T_ >::type > & str
Очевидно, что приведенный выше пример терпит неудачу из-за const
, отсюда и необходимость remove_cv
после remove_extent
.
Ожидается ли это, и есть ли способ достичь этого?