我是从std::tuple派生的,但由于类模板参数演绎的问题,无法从初始化程序列表构造派生类。是否有更好的方法来构造这样一个类,而不仅仅是给它一个已经构造的元组first{ std::tuple{1, 1.0f, 1u} };。
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; });
}发布于 2022-07-28 08:51:24
继承的构造函数不是CTAD的一部分。
你可以复制std:元组CTAD
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发布于 2022-07-28 06:23:23
我不能确切地告诉您为什么using std::tuple<T, Types...>::tuple;指令在这里不能工作,但是如果您只定义接受参数T, Types...和手动接受std::tuple<T, Types...>的构造函数,那么一切似乎都很好:
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;
}产出如下:
1, 1, 1
4, 1, 1这就是你想要的?
https://stackoverflow.com/questions/73147898
复制相似问题