【发布时间】:2017-11-04 12:33:00
【问题描述】:
在某个.cpp中如何判断某个类型是否为完整类型?
template<class T>class Test{
//some fields
void(*functor)(T*) =[](T*){};
//^ will be written by some .cpp that can access T as complete-type
T* t=nullptr;
void fComplete(){
delete t; //faster
/** ^ some code that use complete type*/
}
void fForward(){
functor(t); //slower
/** ^ some code that forward declaration is enough*/
}
void f(){
/*if(T is complete type){
fComplete();
}else fForward();*/
}
};
当我想过早优化自定义智能指针中的删除功能时,它会很有用。
谁能确认这是不可能的?
我不是在寻求解决方法(但我不介意)——这个问题只是我的好奇心。
【问题讨论】:
-
我曾希望这会奏效,但遗憾的是它没有...ideone.com/nEGsZu
-
您可以根据类型是否完整来进行工作,但您的模板必须始终评估相同的内容,否则会违反 ODR。
-
如果您使用 type trait 评估类型不完整,那么在所有翻译单元中,您的 trait 必须产生相同的结果。
-
@Curious 很抱歉,如果不清楚。这是对问题的评论。尝试在编译时根据类型是否完整进行分支是一个坏主意,尤其是如果该类型在另一个翻译单元中可能是完整的。
-
@Guillaume Racicot 我的直觉也(轻轻地)告诉我这是一个坏主意,但我找不到任何具体原因。如果您不介意,请您分享一些原因吗?
标签: c++ templates c++14 incomplete-type