如何使我的 sizeof sum 结构与空参数包一起工作
How do I make my sizeof sum struct work with an empty parameter pack
我有这个可变参数结构来确定传入的所有类型的大小之和:
template <typename U, typename... T> struct TotalSizeOf
: std::integral_constant<size_t, sizeof(U) + TotalSizeOf<T...>::value> {};
template <typename U> struct TotalSizeOf<U>
: std::integral_constant<size_t, sizeof(U)> {};
用法:TotalSizeOf<double, int, char>::value
问题是,我如何修改它以允许它在空参数包上工作,返回0
;
例如TotalSizeOf<>::value
目前,我收到错误error: wrong number of template arguments (0, should be at least 1)
我只有 C++14 可用。
你只需要专注于<>
例:
template < typename... T> struct TotalSizeOf;
template < typename U, typename... T> struct TotalSizeOf<U, T...>
: std::integral_constant<size_t, sizeof(U) + TotalSizeOf<T...>::value> {};
template <> struct TotalSizeOf<> :
std::integral_constant<size_t, 0 > { };
int main()
{
std::cout << TotalSizeOf< int, char>::value << std::endl;
std::cout << TotalSizeOf< char>::value << std::endl;
std::cout << TotalSizeOf< >::value << std::endl;
}
使用 C++17,您可以使用折叠表达式无需复杂的模板元编程即可获得它:
#include <iostream>
#include <type_traits>
template<class... T>
struct TotalSizeOf: std::integral_constant<std::size_t, (0 + ... + sizeof(T))> {};
int main()
{
std::cout << TotalSizeOf< int, char>::value << std::endl;
std::cout << TotalSizeOf< char>::value << std::endl;
std::cout << TotalSizeOf< >::value << std::endl;
}
这在编译时也应该更有效(当然在运行时,这些是相同的(。
PS:只是阅读,你只有C++14,但会让它站在这里,因为我认为很高兴看到,我们不太被迫在较新的C++版本中做笨拙的TMP。
附录:不如 C++17 优雅,但C++14 且几乎无 tmp。
#include <iostream>
#include <type_traits>
#include <initializer_list>
constexpr size_t sum(std::initializer_list<size_t> arr) {
// Accumulate is sadly not constexpr in C++14
auto ret = 0ul;
for(auto i: arr) {
ret += i;
}
return ret;
}
template<class... T>
struct TotalSizeOf: std::integral_constant<std::size_t, sum({sizeof(T)...})> {};
int main()
{
std::cout << TotalSizeOf< int, char>::value << std::endl;
std::cout << TotalSizeOf< char>::value << std::endl;
std::cout << TotalSizeOf< >::value << std::endl;
}
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 是否可以检索与柯南包管理器一起打包的库的源代码,以便在其中进行调试?
- 如何将库与CMAKE一起包含在OSX捆绑包中
- ARMA_NO_DEBUG与RcppArmadillo一起在R包中
- 是否可以在不安装可分发的 VC++ 包的情况下将 MSVCRT DLL 与我的应用捆绑在一起
- 将 VT 解包与元序列交织在一起
- Windows/Winsock UDP 数据包正在分组在一起
- 与OpenCV 3.0捆绑在一起的IPPCV软件包是否包括所有可能的与ipp相关的OpenCV函数运行的改进?
- 我是否必须将Qt库与我的软件包一起部署
- 在带有Rcpp的R包中,将头(.h)文件与cpp文件一起使用