gpt4 book ai didi

c++ - 扣除指南的尾随返回类型不是特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:27 25 4
gpt4 key购买 nike

我正在尝试使用 c++17 中的新推导指南进行高级类模板参数推导。不幸的是,看起来您只能在 -> 之后使用简单的模板声明。 ,但我需要一个辅助结构来确定结果类型。

我的用例是这样的:我有一个可变模板类,它接受任意数量的不同类型。对于一个构造函数,我想指定每个构造函数,对于另一个构造函数,我只想指定一种类型并将其复制 N 次。

要访问此 N在演绎指南中我介绍了一种新类型:

template<size_t N>
struct Replicate { };

我上的课和这个很相似:

template<typename... Foos>
struct Foo {
// [ ... ] member std::tuple<Foos...>

// ctor 1: give values for all types (easy to deduce)
Foo(Foos&&... args /* rvalue ref, NOT forwarding */) { };

// ctor 2: give one value and N, result is N copies of this value.
// takes Replicate<N> as parameter to aid the deduction.
template<typename T, size_t N>
Foo(const T& t, Replicate<N>) { };
};

用法是这样的:

Foo f1{1, 2, 3.0}; // deduce Foo<int, int, double>;
Foo f2{8, Replicate<4>{}}; // deduce Foo<int, int, int, int>;

第一个的推导指南很简单:

template<typename... Ts>
Foo(Ts&&...) -> Foo<Ts...>;

第二个 (ctor 2) 演绎指南出现问题。首先,我需要一个辅助结构来创建 Foo<T, T, ... /* total N times */, T>来自 TN .

template<typename, typename, typename>
struct ExpandNTimes;

template<typename T, size_t... Is>
struct ExpandNTimes<T, std::index_sequence<Is...>> {
template<size_t> using NthType = T;
using Type = Foo<NthType<Is>...>;
};

然后在演绎指南中,我想利用助手来演绎正确的类型。我不能直接使用 Foo<something>由于没有任何类型的“就地参数包创建”,因此没有辅助结构。

template<typename T, size_t N>
Foo(const T&, Replicate<N>) -> typename ExpandNTimes<T, std::make_index_sequence<N>>::Type;

不幸的是,这会导致与此类似的错误:

error: trailing return type of 'typename ExpandNTimes<T, /* std things */>::Type' deduction guide is not a specialization of ‘Foo<Ts>’

有什么办法可以解决这个问题吗?

最佳答案

这对于类模板参数推导是不可能的 - 两个模板名称必须是 the same , -> 之后的内容必须是 simple-template-id .这不会为模板恶作剧留下任何空间。

但是没有什么能阻止你做类模板参数推导旨在取代的事情:工厂函数:

template <typename T, size_t N>
typename ExpandNTimes<T, std::make_index_sequence<N>>::Type
makeFoo(T const&, Repliace<N>);

关于c++ - 扣除指南的尾随返回类型不是特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49389452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com