Я хотел бы написать шаблон функции, например
template< typename T >
void foo( T& obj ){
obj[0] = xxxxxx;
}
Где T должен иметь применимый оператор [].
T может быть массивом любого типа, std :: vector, std :: array или любого другого типа. Итак, я не могу использовать T как суперкласс всех из них. Я думаю, это должно быть что-то вроде стиля std :: type_traits.
2 ответа
template<class T>
using LvalueIndexable = decltype(std::declval<T&>()[1]);
template<class T, class U = void>
using RequiresLvalueIndexable
= typename std::enable_if<std::experimental::is_detected<LvalueIndexable, T>{},
U>::type;
template< typename T, typename = RequiresLvalueIndexable<T> >
void foo( T& obj ){
obj[0] = xxxxxx;
}
См. страницу cppreference, чтобы узнать, как реализовать std::experimental::is_detected
.
Есть несколько способов ограничить типы шаблонов:
1) объявить шаблон функции как метод частного класса, а затем вызвать его из общедоступных перегруженных методов, как описано в здесь;
2) использование статического утверждения Boost и is_base_of
для сравнения шаблона и типов, см. здесь;
3) или включить type_traits
и использовать утверждения static_assert(is_same<T, float>::value, "Error message");
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.