diff --git a/slsDetectorSoftware/include/Result.h b/slsDetectorSoftware/include/Result.h index 54d19b1a5..92a96aaaf 100644 --- a/slsDetectorSoftware/include/Result.h +++ b/slsDetectorSoftware/include/Result.h @@ -31,7 +31,6 @@ template > class Result { Result() = default; Result(std::initializer_list list) : vec(list){}; - /** Custom constructor from integer type to Result or Result */ template ::value && @@ -98,9 +97,14 @@ template > class Result { vec.push_back(std::forward(value)); } + /** Disable emplace_back if the underlying vector does not support it + * vector gcc 4.8 + */ template - auto emplace_back(Args &&... args) -> decltype(vec.emplace_back(args...)){ - vec.emplace_back(std::forward(args)...); + auto emplace_back(Args &&... args) -> + typename std::enable_if>::value, + decltype(vec.emplace_back(args...))>::type { + return vec.emplace_back(std::forward(args)...); } auto operator[](size_type pos) -> decltype(vec[pos]) { return vec[pos]; } diff --git a/slsSupportLib/include/TypeTraits.h b/slsSupportLib/include/TypeTraits.h index 71d37e9ad..39b9525c2 100644 --- a/slsSupportLib/include/TypeTraits.h +++ b/slsSupportLib/include/TypeTraits.h @@ -35,6 +35,19 @@ struct has_str().str())>, void>::type> : public std::true_type {}; +/** + * Has emplace_back method + */ +template struct has_emplace_back : std::false_type {}; + +template struct has_emplace_back_helper {}; + +template +struct has_emplace_back().emplace_back())>, + void>::type> : public std::true_type {}; + /** * Type trait to evaluate if template parameter is * complying with a standard container diff --git a/slsSupportLib/tests/test-TypeTraits.cpp b/slsSupportLib/tests/test-TypeTraits.cpp index 2234ca0ae..0df0ed186 100644 --- a/slsSupportLib/tests/test-TypeTraits.cpp +++ b/slsSupportLib/tests/test-TypeTraits.cpp @@ -43,4 +43,9 @@ TEST_CASE("sls::is_duration"){ TEST_CASE("initializer list"){ REQUIRE(sls::is_light_container>::value == true); +} + +TEST_CASE("Check for emplace back"){ + //we know vector should have this its the type trait that is tested + REQUIRE(sls::has_emplace_back>::value == true); } \ No newline at end of file