gpt4 book ai didi

c++ - 避免在此模板代码中创建变量

转载 作者:行者123 更新时间:2023-11-30 00:53:07 24 4
gpt4 key购买 nike

我有一个模板:

template<typename... Ts> //T1,T2,T3,...
struct foo {
//my struct
};

我想对 T1、T3、T5...(“奇数类型”)和 T2、T4、T6...(“偶数类型”)进行 static_assert 检查) 分开。

我找到了这个简单的解决方案:

template<size_t N, typename... Ts>
struct perform_checks {};

template<size_t N, typename T, typename U, typename... Ts>
struct perform_checks<N, T, U, Ts...> : perform_checks<N, Ts...>
{
//check for odd types
static_assert(std::is_default_constructible<T>::value,"failure");

//check for even types
static_assert(std::is_copy_constructible<U>::value,"failure");
};

N 参数允许它结束。我这样使用它:

template<typename... Ts>
struct foo {
perform_checks<0,Ts...> hello;
};

这似乎工作正常。但是有没有可能避免 hello 变量呢?我从不将它用于任何其他目的。

最佳答案

派生 foo来自 perform_checks<>私下:

template <typename... Ts> struct foo : private perform_checks<Ts...> {
// stuff
};

哦,去掉 N您不需要的参数:

template <typename... Ts> struct perform_checks {};
template <typename T> struct perform_checks<T> {
template <typename U> struct dependent_name_hack : std::false_type {};
static_assert(dependent_name_hack<T>::value,
"Odd number of parameters not acceptable.");
};
template <typename T, typename U, typename... Ts>
struct perform_checks<T, U, Ts...> : perform_checks<Ts...> {
//check for odd types
static_assert(std::is_default_constructible<T>::value,"failure");

//check for even types
static_assert(std::is_copy_constructible<U>::value,"failure");
};

关于c++ - 避免在此模板代码中创建变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17354237/

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