mirror of
https://github.com/esphome/esphome.git
synced 2026-09-20 19:48:39 +00:00
we have c++20
This commit is contained in:
@@ -27,20 +27,21 @@ template<typename T, typename... X> class TemplatableValue {
|
||||
public:
|
||||
TemplatableValue() : type_(NONE) {}
|
||||
|
||||
template<typename F, enable_if_t<!is_invocable<F, X...>::value, int> = 0> TemplatableValue(F value) : type_(VALUE) {
|
||||
template<typename F>
|
||||
requires(!std::invocable<F, X...>) TemplatableValue(F value) : type_(VALUE) {
|
||||
new (&this->value_) T(std::move(value));
|
||||
}
|
||||
|
||||
// For stateless lambdas (convertible to function pointer): use function pointer
|
||||
template<typename F, enable_if_t<is_invocable<F, X...>::value && std::is_convertible<F, T (*)(X...)>::value, int> = 0>
|
||||
TemplatableValue(F f) : type_(STATELESS_LAMBDA) {
|
||||
template<typename F>
|
||||
requires std::invocable<F, X...> && std::convertible_to<F, T (*)(X...)> TemplatableValue(F f)
|
||||
: type_(STATELESS_LAMBDA) {
|
||||
this->stateless_f_ = f; // Implicit conversion to function pointer
|
||||
}
|
||||
|
||||
// For stateful lambdas (not convertible to function pointer): use std::function
|
||||
template<typename F,
|
||||
enable_if_t<is_invocable<F, X...>::value && !std::is_convertible<F, T (*)(X...)>::value, int> = 0>
|
||||
TemplatableValue(F f) : type_(LAMBDA) {
|
||||
template<typename F>
|
||||
requires std::invocable<F, X...> &&(!std::convertible_to<F, T (*)(X...)>) TemplatableValue(F f) : type_(LAMBDA) {
|
||||
this->f_ = new std::function<T(X...)>(std::move(f));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user