c++ - 如何使用另一个类作为类模板特化

标签 c++ templates c++11 template-specialization

我有一个混合锁类,它在回退到阻塞 std::mutex 之前尝试锁(编译时固定)自旋数,直到锁可用。

简化:

#include <mutex>

template<unsigned SPIN_LIMIT>
class hybrid_lock {
public:
    void lock(){
        for(unsigned i(0);i<SPIN_LIMIT;++i){
            if(this->mMutex.try_lock()){
                return;        
            }
        } 
        this->mMutex.lock();
    }
    void unlock(){
        this->mMutex.unlock();
    }
private:
    std::mutex mMutex;
};

SPIN_LIMIT==0 的特殊情况下,这会退回到“普通”std::mutex(即没有可见旋转)。

所以我将其专门用于:

template<>
class hybrid_lock<0> : public std::mutex {};

它工作正常,但是将类模板专门化为另一个(预先存在的)模板的方法是否被批准?

最佳答案

注意:我回答的是实际问题,而不是标题中的问题。

那么,现在 hybird_lock<0>hybird_lock<1>完全不同,一个来自 std::mutex另一个包含/包装它。这改变了 hybird_lock 的整个宪法以及背后的意义。 IE。它们在语义上并不相同。这可能会导致一些意想不到的后果 - hybird_lock<0>会继承很多东西,这是其他案例所没有的。

如果这是唯一的区别,我根本不会为特化而烦恼。请记住,零案例将在编译时已知,并且可以肯定的是,整个循环将被完全优化。

如果还有其他重要的(或实际的)优化,我会去做类似的事情:

template<>
class hybrid_lock<0> {
public:
    void lock(){
      this->mMutex.lock();
    }
    void unlock(){
      this->mMutex.unlock();
    }
private:
    std::mutex mMutex;
};

此实现使得 0一个特例,而不是几乎完全不同的东西。

关于c++ - 如何使用另一个类作为类模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31140870/

相关文章:

c++ - 函数模板 : why ambiguity is generated?

c++ - Qt:将拖放委托(delegate)给 child 的最佳方式

c++ - 如何在 Windows 中获取 PyErr_Print 的输出或将其保存为字符串

c++ - 是否有通用方法从枚举 NetworkError 中获取网络错误字符串,或者我是否需要构建一个?

c++ - 在模板中捕获异常类

php - 生成动态 docx 文档

c++ - Boost.Spirit 可以在理论上/实践上用于解析 C++(0x)(或任何其他语言)吗?

c++ - 变量类派生自某个抽象类的类模板

c++ - 什么是 C++11 中的 lambda 表达式?

c++ - 为什么需要唯一指针中的 move 构造函数和 move 赋值构造函数?