summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-10-24 00:45:32 +0300
committerJacopo Mondi <jacopo@jmondi.org>2020-10-26 17:51:32 +0100
commit581bb274956fcf7e781384342e88cd8fa35b1336 (patch)
tree09bf5011b6f607c7d48e37cb5ad2809ca898815b /include
parentc430d39d203488cf93ab4f12ff9eb8b3c6380212 (diff)
libcamera: controls: Disable ControlValue<T> construction from unsupported T
The ControlValue<T> constructor for non-array values is a template function that participates in overload resolution for all T types that are not Span or std::string. Other T types that are not supported then result in a compilation error. This causes issues when calling an overloaded function that can accept both a ControlValue and a Span with an std::array<U> parameter. The first overload will be resolved using implicit construction of a ControlValue from the std::array<U>, while the second overload will be resolved using implicit construction of a Span<U> from the std::array<U>. This results in a compilation error due to an ambiguous function call. The first overload is invalid, selecting it would result in a compilation error in the ControlValue constructor, as the ControlValue<T> constructor doesn't support std::array<U> for type T. The compiler can't know about that, as overload resolution happens earlier. To fix it, we can disable the ControlValue<T> constructor for unsupported types T, moving the type check from compilation of the function to overload resolution. The constructor will not participate in overload resolution, and the call won't be ambiguous. The end result is the same for unsupported types, compilation will fail. Acked-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'include')
-rw-r--r--include/libcamera/controls.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index 80944efc..a556328c 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -96,6 +96,7 @@ public:
#ifndef __DOXYGEN__
template<typename T, typename std::enable_if_t<!details::is_span<T>::value &&
+ details::control_type<T>::value &&
!std::is_same<std::string, std::remove_cv_t<T>>::value,
std::nullptr_t> = nullptr>
ControlValue(const T &value)