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

Per*_*xty 6 c++ templates template-specialization c++11

我有一个混合锁定类,旋转尝试锁定(编译时固定)旋转次数,然后再回到阻塞状态,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;
};
Run Code Online (Sandbox Code Playgroud)

在特殊情况下,SPIN_LIMIT==0这可以回归到"平原" std::mutex(即没有可见的旋转).

所以我专门用于:

template<>
class hybrid_lock<0> : public std::mutex {};
Run Code Online (Sandbox Code Playgroud)

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

luk*_*k32 1

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

好吧,现在hybird_lock<0>hybird_lock<1>是完全不同的东西,一个源自它std::mutex,另一个包含/包装它。这改变了它的整个构成hybird_lock及其背后的意义。即它们在语义上并不相同。这可能会导致一些相当意想不到的后果——hybird_lock<0>会继承很多东西,而其他情况则不会。

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

如果还有其他重要的(或实际的)优化,我会选择类似的东西:

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

此实现是0一种特殊情况,而不是几乎完全不同的情况。