是的,但是是间接的。
对于其他有类似问题但想要有效解决方法的人,而不是语言律师:
这可能是一个深奥的例子,但它实际上与该技术的实际应用非常接近。
您使用 C++17 中的演绎指南和接受辅助类型的附加构造函数。当你有一个包含许多模板参数的类时,这通常会更容易。
https://en.cppreference.com/w/cpp/language/class_template_argument_deduction
template <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
编辑,为元组添加示例
以元组为例:
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');