C++11 使用C++;11个模板,用于生成算法的多个版本

C++11 使用C++;11个模板,用于生成算法的多个版本,c++11,templates,C++11,Templates,假设我正在进行某种类型的通用集合,用户可能需要选择实现a或B的地方有4-5个点。例如: 同质还是异质 我们是否保持包含对象的计数,这会更慢 我们有没有线程安全的 我可以用每种功能组合实现16或32个实现,但显然这并不容易编写或维护 我可以将布尔标志传递给构造函数,类可以在执行某些操作之前检查这些标志。然而,编译器并不“知道”这些参数是什么,所以每次都必须检查它们,而仅仅检查足够多的布尔标志本身就会造成性能损失 因此,我想知道是否可以以某种方式使用模板参数,以便编译器在编译时看到if(fals

假设我正在进行某种类型的通用集合,用户可能需要选择实现a或B的地方有4-5个点。例如:

  • 同质还是异质
  • 我们是否保持包含对象的计数,这会更慢
  • 我们有没有线程安全的
我可以用每种功能组合实现16或32个实现,但显然这并不容易编写或维护

我可以将布尔标志传递给构造函数,类可以在执行某些操作之前检查这些标志。然而,编译器并不“知道”这些参数是什么,所以每次都必须检查它们,而仅仅检查足够多的布尔标志本身就会造成性能损失

因此,我想知道是否可以以某种方式使用模板参数,以便编译器在编译时看到
if(false)
if(true)
,从而完全优化条件测试,如果为false,则优化条件代码。但是,我只发现模板作为类型的例子,而不是作为编译时常量的例子


主要目标是完全消除那些锁定互斥锁、递增和递减计数器等的调用,但另外,如果有某种方法可以从对象结构中实际移除互斥锁或计数器,那将是真正的最佳选择。

17之前的条件计算主要与模板专门化有关。要么专门化函数本身

模板无效f(int){

std::cout
if 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 :(
}