Как определить, является ли параметр шаблона std::complex
? Мне нужен общий метод, который поддерживает все типы данных, такие как float, double, int и т. Д. Я знаю, что с помощью std :: is_same я могу проверить конкретный тип данных, например std::complex<float>
. Но здесь мне нужен общий метод.Как определить, является ли аргумент шаблона std :: complex?
ответ
Насколько я понимаю ваш вопрос, вы ищете реализацию общего метода для проверки, является ли данный тип специализацией заданного типа шаблона шаблона. Это можно сделать с помощью шаблона класса, как в Frank's answer. Я представлю вам дополнительный подход к специализации - типа шаблона псевдонима с функцией перегрузкой:
#include <type_traits>
#include <complex>
#include <iostream>
template <template <class...> class TT, class... Args>
std::true_type is_tt_impl(TT<Args...>);
template <template <class...> class TT>
std::false_type is_tt_impl(...);
template <template <class...> class TT, class T>
using is_tt = decltype(is_tt_impl<TT>(std::declval<typename std::decay<T>::type>()));
int main() {
static_assert(is_tt<std::complex, std::complex<int>>::value, "!");
static_assert(is_tt<std::complex, std::complex<float>>::value, "!");
static_assert(!is_tt<std::complex, float>::value, "!");
}
Вы можете использовать черту следующим образом:
#include <type_traits>
#include <complex>
#include <iostream>
//complementary approach to specialization one would be to use function overloading
template <template <class...> class TT, class... Args>
std::true_type is_tt_impl(TT<Args...>);
template <template <class...> class TT>
std::false_type is_tt_impl(...);
template <template <class...> class TT, class T>
using is_tt = decltype(is_tt_impl<TT>(std::declval<typename std::decay<T>::type>()));
template <class T>
typename std::enable_if<is_tt<std::complex, T>::value>::type print(T t) {
std::cout << "(" << t.real() << "," << t.imag() << ")" << std::endl;
}
template <class T>
typename std::enable_if<!is_tt<std::complex, T>::value>::type print(T t) {
std::cout << t << std::endl;
}
int main() {
print(std::complex<int>(1, 2));
print(std::complex<double>(1.5, 2.5));
print(5.5);
}
(1,2)
(1.5.2.5)
5.5
Это может быть сделано с использованием частичной специализированной специализации.
Сначала нужно определить кетчуп все шаблон, который по умолчанию неверно:
template<typename T>
struct is_complex_t : public std::false_type {};
Затем обеспечивают перегрузку для типов, которые соответствуют вашему условию:
template<typename T>
struct is_complex_t<std::complex<T>> : public std::true_type {};
Я также хотел бы добавить утилиту также:
template<typename T>
constexpr bool is_complex() { return is_complex_t<T>::value; }
Редактировать: Данная функция полезности не требуется или полезна. с C++ 14 и выше, поскольку std :: integral_type реализует operator().
Использование:
bool int_is_complex = is_complex<int>(); //false
bool complex_is_complex = is_complex<std::complex<float>>(); //true
Вы можете основывать свое решение на тег диспетчерскую технике.
вытекает минимальный, рабочий пример:
#include<complex>
#include<utility>
#include<iostream>
class C {
template<typename T>
void f(int, std::complex<T>) {
std::cout << "complex" << std::endl;
}
template<typename T>
void f(char, T &&t) {
std::cout << "something else" << std::endl;
}
public:
template<typename T>
void f(T &&t) {
f(0, std::forward<T>(t));
}
};
int main() {
C c;
c.f(0);
c.f(std::complex<float>{});
}
Здесь у вас есть общий метод f
, который принимает почти все и отправляет внутренне к правой функции.
- 1. Как определить, является ли аргумент шаблона функцией noexcept?
- 2. std :: tuple как аргумент шаблона?
- 3. Перегрузка функции шаблона для std :: complex
- 4. std :: vector как аргумент функции шаблона
- 5. Сообщите, является ли аргумент шаблона структурой
- 6. std :: enable_if аргумент является функцией?
- 7. Определить, является ли аргумент классом или протоколом
- 8. std :: enable_if не компилируется (неверный аргумент шаблона)
- 9. Аргумент шаблона и вывод std :: function parameters
- 10. По умолчанию параметр шаблона -> аргумент шаблона включает параметр шаблона
- 11. аргумент шаблона класса шаблона
- 12. C++, аргумент шаблона шаблона
- 13. Функция передана как аргумент шаблона
- 14. Как проверить, является ли аргумент шаблона по умолчанию конструктивным
- 15. Проверьте, является ли аргумент шаблона std :: vector <T> :: iterator
- 16. Как определить, является ли аргумент объектом или встроенным?
- 17. Возможно ли использовать аргумент шаблона std :: pair as (sole) для ассоциативного контейнера, такого как std :: map?
- 18. C# SOAP Complex Type Аргумент
- 19. Есть ли способ определить, является ли примитивный аргумент переменным размером?
- 20. Попытка определить функцию шаблона, которая принимает аргумент шаблона
- 21. Как я могу использовать Variadic std :: tuple как аргумент шаблона?
- 22. Visual Studio std :: complex Performance
- 23. неявный аргумент шаблона является недействительным, но компилирует все равно
- 24. Как определить тип шаблона, является ли базовый тип или класс
- 25. Как определить, является ли параметр шаблона встроенным или нет?
- 26. аргумент шаблона rvalue, неявно используемый как lvalue, и std :: forwarding
- 27. C++ method как аргумент шаблона
- 28. Есть ли способ гарантировать, что аргумент шаблона является контейнером?
- 29. Как избежать встроенного `std :: complex` при предоставлении` T = std :: complex <Q> `?
- 30. Как определить, доступен ли std :: chrono :: monotonic_clock?
шаблона Специализация – Danh
Что вы хотите "специализироваться"? Добавьте конкретный пример, на ваш пост нет достаточной информации, чтобы ответить, как есть. – Holt