我从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。
任何建议都非常欢迎
当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。
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |