首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承CTAD构造函数

继承CTAD构造函数
EN

Stack Overflow用户
提问于 2022-07-28 05:57:51
回答 2查看 82关注 0票数 2

我是从std::tuple派生的,但由于类模板参数演绎的问题,无法从初始化程序列表构造派生类。是否有更好的方法来构造这样一个类,而不仅仅是给它一个已经构造的元组first{ std::tuple{1, 1.0f, 1u} };

代码语言:javascript
复制
template <typename T, typename... Types>
struct first : public std::tuple<T, Types...>
{
    //using std::tuple<T, Types...>::tuple;
    template<typename F>
        requires std::invocable<F, T>
    auto transform(F f)
    {
        auto result = *this;
        std::get<0>(result) = f(std::get<0>(result));
        return result;
    }
};

int main()
{
    //auto tuple = first{ 1, 1.0f, 1u };
    auto tuple = first{ std::tuple{1, 1.0f, 1u} };
    auto tuple2 = tuple.transform([](auto a) {return a + 3; });
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-28 08:51:24

继承的构造函数不是CTAD的一部分。

你可以复制std:元组CTAD

代码语言:javascript
复制
template <typename T, typename... Types>
first(T, Types...) -> first<T, Types...>;

// auto tuple = first{1, 1.0f, 1u}; // is ok now
// auto tuple = first{ std::tuple{1, 1.0f, 1u} }; // broken now

演示

票数 2
EN

Stack Overflow用户

发布于 2022-07-28 06:23:23

我不能确切地告诉您为什么using std::tuple<T, Types...>::tuple;指令在这里不能工作,但是如果您只定义接受参数T, Types...和手动接受std::tuple<T, Types...>的构造函数,那么一切似乎都很好:

代码语言:javascript
复制
template <typename T, typename... Types>
struct first : public std::tuple<T, Types...>
{
    first(T&& t, Types&&... vals)
        : std::tuple<T, Types...>{t, std::forward<Types>(vals)...}
    {}

    first(std::tuple<T, Types...>&& t)
        : std::tuple<T, Types...>(t)
    {}

    template<typename F>
        requires std::invocable<F, T>
    auto transform(F f)
    {
        auto result = *this;
        std::get<0>(result) = f(std::get<0>(result));
        return result;
    }
};

int main()
{
    auto tuple1 = first{1, 1.0f, 1u};
    auto tuple2 = first{std::tuple{1, 1.0f, 1u}};
    auto tuple3 = tuple2.transform([](auto a) {return a + 3; });

    std::cout << std::get<0>(tuple1) << ", " << std::get<1>(tuple1) << ", " << std::get<2>(tuple1) << std::endl;
    std::cout << std::get<0>(tuple3) << ", " << std::get<1>(tuple3) << ", " << std::get<2>(tuple3) << std::endl;
}

产出如下:

代码语言:javascript
复制
1, 1, 1
4, 1, 1

这就是你想要的?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73147898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档