【发布时间】:2019-05-16 02:54:01
【问题描述】:
我在声明以下内容时遇到了问题:
// c++17
template<typename T, typename ...Before, T v, typename ...After, template<typename ..., T, typename ...> U>
auto enum_to_type() {
// do things with
// U<Before..., v, After...> obj;
// as an example:
return U<Before..., v + 1, After...>{};
}
// demonstrate of usage
template<int v>
struct A {};
template<typename T, int v>
struct B {};
/// call enum_to_type to get next type
/// note: the following does not compile
using next_A = decltype(enum_to_type<int, 0, A>());
// == A<1>
template<typename T>
using next_B = decltype(enum_to_type<int, T, 0, B>());
// == B<1>
这个函数的目的是编写通用代码,可以利用非类型模板参数v从类模板U构造模板类,而不需要知道模板参数是如何在U中声明的.否则,必须为不同的签名编写此函数,例如U<T v>、U<typename, T v>、U<T v, typename> 等。
编辑:我想我想要的可能是不可能的。
【问题讨论】:
-
请演示“有效”的代码。我看不到消除
Before...并使上述代码工作的方法;您仍然会尝试在参数包之后传递U,据我所知,这是不可行的。 -
@Yakk-AdamNevraumont 我刚刚用一些用例更新了这个问题
-
尽管明确要求您提供“有效”的代码,但您未能提供。当您提供您声称“有效”的变体时,请@ping 我,该变体涉及删除
Before...而离开After...。修正错别字并删除之前,编译失败:coliru.stacked-crooked.com/a/41ccc50702c56798 -
"这个函数的目的是编写通用代码,可以利用非类型模板参数v从类模板U构造模板类,而不需要知道模板参数是如何的在 U 中声明。" 这在 C++ 中是不可能的。
-
@Yakk-AdamNevraumont 恐怕你是对的。我发现它“有效”是因为我将我的模板 U 声明为 SFAINE 的
U<T, typename =void>,在这种情况下它会因U<T>而失败。很抱歉造成混乱,感谢您的回答。
标签: c++ templates c++17 variadic-templates generic-programming