从c++ 17开始,构造函数的模板形参推导是否允许显式指定一些类模板实参?
Will template parameter deduction for constructors available since C++17 allow explicitly specify some of the class template arguments?
除了最明显的构造函数的模板形参推导之外,我可以想象一些更复杂的用例,我们只推导模板类的部分形参,例如:
std::pair<int> p(1, 2); // std::pair<int, int>
虽然这种结构是函数中模板形参推导的自然结果,但我找不到任何这种用法的例子。也许是因为在具有可变模板参数的类的情况下存在歧义?
std::tuple<int> t(1, 2, 3); // std::tuple<int, int, int>
然而,这种方式引入的语法不能替代太好的"make_*"包装器(参见N3602),因为我们可以使用该功能…
显然不是。P0091的介绍声称它可以,但实际的措辞说的完全不同:
与类模板对应的模板名,后跟带括号的表达式列表…
这就排除了使用template-name +一些参数和"括号表达式列表"的情况。在语法上,它也被排除在措辞的其他部分。
因此,不可能在推导其他参数的同时指定某些参数
是的,但是间接的。
对于其他有类似问题但想要有效解决的人,而不是语言律师:
这可能是一个深奥的例子,但它实际上与该技术在现实世界中的应用非常接近。
使用c++ 17中的演绎指南和一个接受helper类型的附加构造函数。当你的类有很多模板参数时,这通常更容易。
https://en.cppreference.com/w/cpp/language/class_template_argument_deductiontemplate <std::size_t v>
struct SizeT{};
template <std::size_t v, typename T>
struct PrintToBuffer
{
T const Dunno;
PrintToBuffer(T const & pInput) :
Dunno(pInput)
{}
//This works for any class, as it just forwards to another constructor
template <typename ... Args>
PrintToBuffer(SizeT<v>, Args && ... pInput) :
PrintToBuffer(std::forward<Args>(pInput)...)
{}
void Print(std::array<char, v> & pOutput)
{
for (auto & c : pOutput)
c = Dunno;
}
};
可以在这里设置:
https://godbolt.org/z/E8d1Dt 编辑,添加元组 的示例对于tuple的例子:
template <typename ... Args>
struct Types{};
template <typename ... T>
struct Tuple : std::tuple<T...>
{
using base_t = std::tuple<T...>;
using base_t::base_t;
template <typename ... Ignore>
Tuple(Types<Ignore...>, T && ... pInput) : base_t(std::forward<T>(pInput)...) {}
};
template <typename ... Defined, typename ... Args>
Tuple(Types<Defined...>, Defined && ..., Args&& ...) -> Tuple<Defined..., Args...>;
使用这里的编译器资源管理器,请注意推导的和定义的模板参数都是正确构造的:
https://godbolt.org/z/VrT9Lf用法:
auto my_tuple = Tuple(Types<int, short>{}, 1, 1, 'a');
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 缺少类型说明符,显式类型为"缺少错误"
- 没有显式声明的int[]中的foreach
- 一对向量构造函数:初始值设定项列表与显式构造
- 将依赖名称显式标记为类型名和模板的奇怪之处
- CUDA内核和数学函数的显式命名空间
- 约束和显式模板实例化
- 返回值优化:显式移动还是隐式
- 在CMake中使用find_package时,是否会显式包含标头
- 嵌套模板显式专用化
- 受约束的成员函数和显式模板实例化
- C++ 中的显式比较
- 对显式实例化的模板函数的未定义引用
- C++:用户定义的显式类型转换函数错误
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- c++:候选模板被忽略:模板形参显式指定的参数无效
- 如何在c++函数模板中指定默认的非模板实参初始化式
- 是否存在允许将非const模板实参类型隐式转换为const的规范方法?
- 从c++ 17开始,构造函数的模板形参推导是否允许显式指定一些类模板实参?