我从 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; });
}
最佳答案
继承的构造函数不是 CTAD 的一部分。
您可以复制std::tuple's 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
关于c++ - 继承CTAD构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73147898/