我想编写一个M
接受不完整类型C
作为模板参数的类模板。但我也希望C
在最终定义时具有一些特征。
此代码是否有保证
- 编译如果定义(标志),
- 如果 !defined(FLAG) 编译失败?
template <auto> struct Dummy {};
template <typename C>
void check()
{
static_assert(std::is_trivial_v<C>);
}
template <typename C>
struct M : Dummy<&check<C>>
{
//static_assert(std::is_trivial_v<C>);//error: incomplete type
C * p;
};
struct Test;
M<Test> m;
int main()
{
return 0;
}
#if defined(FLAG)
struct Test {};
#else
struct Test { std::string non_trivial_member; };
#endif