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

C++11 std::从C+之前的初始值设定项推导出的类型向量+;17 ... C+的任何解决方法+;11?,c++11,C++11,我从C++17中了解到,有了演绎指南,std::vector的模板参数可以被演绎,例如,从初始化: std::vector vec = { function_that_calculate_and_return_a_specifically_templated_type() } 然而,在我现在想要编译和运行代码的机器中,我没有C++17的奢侈 C++11是否有任何可能的解决方法?如果存在更多的解决方案,最好是保持代码可读性的解决方案 目前,我唯一的想法是沿着代码跟踪各种情况(幸运的是它们不应该太

我从C++17中了解到,有了演绎指南,std::vector的模板参数可以被演绎,例如,从初始化:

std::vector vec = { function_that_calculate_and_return_a_specifically_templated_type() }
然而,在我现在想要编译和运行代码的机器中,我没有C++17的奢侈

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

目前,我唯一的想法是沿着代码跟踪各种情况(幸运的是它们不应该太多),并使用一些显式的typedef/using


任何建议都是非常受欢迎的

当CTAD不可用时,使用类模板类型推断的常用方法是提供一个
make.*
函数模板,例如针对您的情况(对于C++11,尾部返回类型是必需的):


这至少有点接近CTAD,因为您不必显式地指定向量实例化。

虽然lubgr的答案是正确的,但以下模板更简单,似乎也能工作:

#include <vector>
#include <string>

template <typename T>
std::vector<T> make_vec(const std::initializer_list<T> &list)
{
    return std::vector<T>(list);
}

int main()
{
    auto v = make_vec({1,2,3});
    auto v2 = make_vec({std::string("s")});
    std::string s("t");
    auto v3 = make_vec({s});
    return v.size() + v2.size() + v3.size();
}
#包括
#包括
模板
标准::向量生成向量(常量标准::初始值设定项列表和列表)
{
返回std::vector(列表);
}
int main()
{
auto v=make_vec({1,2,3});
autov2=make_vec({std::string(“s”)});
std::字符串s(“t”);
自动v3=生成向量({s});
返回v.size()+v2.size()+v3.size();
}

直接使用初始值设定项列表模板的一个优点是,如果您传递混合类型,如
make_-vec({1,2,“x”}),则错误消息更清晰,因为无效初始值设定项列表的构造现在发生在非模板化代码中。

在包含它之后就可以工作了。然而,它只有在传递临时变量时才起作用,例如:auto-vec=make_-vec(std::string(“s”);使用时:std::string s(“s”);自动向量=生成向量;我得到一个Looong错误打印输出,可能最具指示性的一行是:/usr/include/c++/6/bits/alloc_traits.h:395:39:error:forming指针指向引用类型“std::u cxx11::basic_string&”,这是有意的吗?好的一点,我修复了同样使用左值引用的答案。如何设置注释中文本的格式?我应该用新的答案而不是评论来回答吗?。。。我是stackoverflow的新手……不,评论绝对正确。您可以将内联代码片段放在背景标记中,如
这是通过“this”实现的。我认为这更简单、更可读,如果专家没有发现任何特殊问题或特殊情况,我会将其标记为解决方案
const auto v = make_vec(1, 2, 3);
#include <vector>
#include <string>

template <typename T>
std::vector<T> make_vec(const std::initializer_list<T> &list)
{
    return std::vector<T>(list);
}

int main()
{
    auto v = make_vec({1,2,3});
    auto v2 = make_vec({std::string("s")});
    std::string s("t");
    auto v3 = make_vec({s});
    return v.size() + v2.size() + v3.size();
}