我编写了这个C++ 11特征模板来检查类型是否完整:
template <typename...>
using void_t = void;
template <typename T, typename = void>
struct is_complete : std::false_type
{};
template <typename T>
struct is_complete<T, void_t<decltype(sizeof(T))>> : std::true_type
{};
Run Code Online (Sandbox Code Playgroud)
并测试它像这样:
struct Complete {};
int main()
{
std::cout << is_complete<Complete>::value
<< is_complete<class Incomplete>::value
<< '\n';
}
Run Code Online (Sandbox Code Playgroud)
我希望打印测试程序10,这是我用clang 3.4编译它时得到的输出.但是,当使用gcc 4.9编译时,它会打印11- 错误地识别class Incomplete为完整.
我不确定我的代码是否正确,但在我看来,即使它是错误的,它在两个编译器上也应该表现相同.
问题1:是我的代码是否正确?
问题2:我是否在其中一个编译器中发现了错误?
编辑:
我不是要求替换我的代码.我问的是gcc或clang中是否存在错误,以及这个特定结构是否正确.
有没有办法,大概是使用模板,宏或两者的组合,我可以通常将一个函数应用于不同类的对象,但如果它们没有特定的功能,它们会以不同的方式响应吗?
我特别想要应用一个函数,如果对象具有该函数,将输出对象的大小(即集合中的对象数),但如果对象没有,则将输出一个简单的替换(例如"N/A") "T.即
NO_OF_ELEMENTS( mySTLMap ) -----> [ calls mySTLMap.size() to give ] ------> 10
NO_OF_ELEMENTS( myNoSizeObj ) --> [ applies compile time logic to give ] -> "N/A"
Run Code Online (Sandbox Code Playgroud)
我希望这可能类似于静态断言,尽管我显然想要编译不同的代码路径而不是在构建阶段失败.