从C ++ 17之前的初始值设定项推导的std :: vector类型... C ++ 11的任何解决方法?

Mat*_*teo 4 c++11

我从C ++ 17了解到,借助推论指南,可以从例如初始化中推导std :: vector的模板参数:

std::vector vec = { function_that_calculate_and_return_a_specifically_templated_type() }
Run Code Online (Sandbox Code Playgroud)

但是,我现在不想编译和运行代码的机器上没有C ++ 17的支持。

C ++ 11是否有任何可能的解决方法?如果存在更多解决方案,那么最好的解决方案就是保持代码的可读性。

目前,我唯一的想法是跟踪代码中的各种情况(幸运的是,它们不应太多)并进行一些显式的typedef / using。

任何建议都非常欢迎

lub*_*bgr 5

当CTAD不可用时,对类模板使用类型推导的通常方法是提供一个make_*函数模板,例如,针对您的情况(对于C ++ 11,必须使用跟踪返回类型):

#include <vector>
#include <type_traits>
#include <tuple>

template <class ...Args>
auto make_vec(Args&&... args) ->
    std::vector<typename std::decay<typename std::tuple_element<0, std::tuple<Args...>>::type>::type>
{
   using First = typename std::decay<typename std::tuple_element<0, std::tuple<Args...>>::type>::type;

   return std::vector<First>{std::forward<Args>(args)...};
}
Run Code Online (Sandbox Code Playgroud)

您可以使用

const auto v = make_vec(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

从不必显式指定向量实例化的意义上讲,它至少有点接近CTAD。