C++11 使用C++;11个模板,用于生成算法的多个版本
假设我正在进行某种类型的通用集合,用户可能需要选择实现a或B的地方有4-5个点。例如:C++11 使用C++;11个模板,用于生成算法的多个版本,c++11,templates,C++11,Templates,假设我正在进行某种类型的通用集合,用户可能需要选择实现a或B的地方有4-5个点。例如: 同质还是异质 我们是否保持包含对象的计数,这会更慢 我们有没有线程安全的 我可以用每种功能组合实现16或32个实现,但显然这并不容易编写或维护 我可以将布尔标志传递给构造函数,类可以在执行某些操作之前检查这些标志。然而,编译器并不“知道”这些参数是什么,所以每次都必须检查它们,而仅仅检查足够多的布尔标志本身就会造成性能损失 因此,我想知道是否可以以某种方式使用模板参数,以便编译器在编译时看到if(fals
- 同质还是异质
- 我们是否保持包含对象的计数,这会更慢
- 我们有没有线程安全的
if(false)
或if(true)
,从而完全优化条件测试,如果为false,则优化条件代码。但是,我只发现模板作为类型的例子,而不是作为编译时常量的例子
主要目标是完全消除那些锁定互斥锁、递增和递减计数器等的调用,但另外,如果有某种方法可以从对象结构中实际移除互斥锁或计数器,那将是真正的最佳选择。17之前的条件计算主要与模板专门化有关。要么专门化函数本身
模板无效f(int){
std::coutif constexpr
是在C++17中引入的。在此之前,模板专门化是唯一的选择。@bipll模板专门化?这在这里适用吗?好的,但是如果我很高兴让代码读取if(true),该怎么办
并且只需信任编译器优化就可以删除它?您正在显示的代码非常有趣,但是删除未优化的构建中的代码不是一个优先事项…好吧,如果您确定它可以编译。您无法真正锁定int,因此if(std::is__v)t.lock()当t
为int
时,
不会编译,但如果constexpr(std::is_same_v)t.lock();
会编译。
template<class T> void f(T &t) {
if constexpr<std::is_same_v<T, std::mutex>> {
t.lock();
}
else if constexpr<std::is_same_v<T, int>> {
std::cout << "Locking an int...\n";
}
if constexpr<std::is_same_v<T, std::mutex>> {
t.unlock();
}
// forgot to unlock an int here :(
}