【发布时间】:2019-04-11 15:23:02
【问题描述】:
当我在启用 C++11 的情况下编译代码时,我有以下代码有效。是否也可以编写专门化以使其与 C++98 编译器一起使用?
#include <iostream>
#include <type_traits>
#include <cstdint>
template<typename T, typename std::enable_if_t<!std::is_pointer<T>::value, int> = 0>
void CheckSize(T const)
{
cout << "sizeof(data): " << sizeof(T) << endl;
}
template<typename T, typename std::enable_if_t<std::is_pointer<T>::value, int> = 0>
void CheckSize(T const)
{
cout << "sizeof(data) (pointer): " << sizeof(std::remove_pointer<T>) << endl;
}
template<typename T, size_t N>
void CheckSize(T const (&)[N])
{
cout << "sizeof(data) (array): " << sizeof(T) * N << endl;
}
int main()
{
uint8_t bufferNumber{0};
CheckSize(bufferNumber);
uint8_t bufferArray[] = {1,2,3,4,5,6};
CheckSize(bufferArray);
uint8_t *bufferPointer{nullptr};
CheckSize(bufferPointer);
return 0;
}
我也不明白为什么编译器在编写时不能应用特化:
template<typename T>
void CheckSize(T const)
{
cout << "sizeof(data): " << sizeof(T) << endl;
}
template<typename T>
void CheckSize(T const*)
{
cout << "sizeof(data) (pointer): " << sizeof(T) << endl;
}
MSVC2015 将打印一条错误消息,指出函数调用对于 bufferArray 变量的重载函数不明确,MinGW 将使用 CheckSize(T const) 函数作为 bufferPointer 变量。
【问题讨论】:
-
Boost 提供了
enable_if和很多/所有可以在 C++98 中使用的特征。如果你必须使用 C++98 那么你应该考虑使用 boost 而不是自己尝试实现它。 -
如果打印
sizeof(T) * N,创建此模板有什么意义?sizeof(bufferArray)提供相同的值。你想达到什么目标? -
这里只是示例代码。我需要数据的大小,因为我想在函数中使用底层数据(将其复制到缓冲区中)。
标签: c++ template-specialization c++98