考虑以下 variadic 类:
template <typename... Args>
struct Foo {
template <typename... OArgs>
Foo(const OArgs&... args) {
static_assert(std::is_same_v<Foo<Args...>, Foo<OArgs...>>);
}
};
当我需要实例化此类时,我需要指定类模板参数。
int main() {
Foo<int, double> foo1{42, 3.14};
return 0;
}
到目前为止有效;但是,嘿,这是 C ++ 17 ,我可以使用CTAD并让编译器推断类型。
这是规则:
template <typename... Ts>
explicit Foo(const Ts&...)->Foo<Ts...>;
现在我的实例化应该更容易了:
int main() {
Foo foo2{42, 3.14};
return 0;
}
但是,我在 gcc 上得到了预期的结果。
实际上, gcc 总是推断出Args = {}
(一个空包)。
<source>: In instantiation of 'Foo<Args>::Foo(const OArgs& ...) [with OArgs = {int, double}; Args = {}]':
<source>:16:20: required from here
<source>:7:24: error: static assertion failed
注意: clang 对此进行编译。