首页 > 解决方案 > 如何避免在类的构造函数中需要两次提供模板?

问题描述

我有以下两个课程:

template<std::size_t Num>
class Foo
{
public:
    Foo(const std::array<int,Num>& nums)
    :
        m_nums(nums){}

protected:
    const std::array<int,Num>& m_nums;
};

template<typename... Foos>
class Bar
{
public:

    Bar(Foos... foos)
    :
        m_foos(std::make_tuple(foos...))
    {

    }

protected:
    std::tuple<Foos...> m_foos;
};

我会这样使用:

int main()
{
    std::array<int,2> nums1 = {0,1};
    std::array<int,1> nums2 = {0};

    Bar<Foo<2>,Foo<1>> bar(Foo<2>(nums1), Foo<1>(nums2));

    return 0;
}

我怎样才能避免需要指定Foo<2>Foo<1>两次?我试过Bar<> bar(Foo<2>(nums1), Foo<1>(nums2));了,但没有编译。

标签: c++

解决方案


使用 CTAD,隐式扣除指南已经为您提供:

Bar bar{Foo<2>(nums1), Foo<1>(nums2)};

https://godbolt.org/z/6g1fkf

(请注意,如果你使用括号而不是花括号,你会在这里遇到最麻烦的解析。)


推荐阅读