std :: atomic <double>&的模板特化

Al *_*ndy 5 c++ templates template-specialization c++11

我有这个MCVE:

#include <stdio.h>
#include <atomic>

template<typename T> void assertVariableHasBeenSet( T, const char * );
template<>           void assertVariableHasBeenSet<std::atomic<double> &>
                                                        ( std::atomic<double> & myDouble, 
                                                          const char * variableName 
                                                        )
{
    printf( "Double:%s=%f\n", variableName,  myDouble.load() );
};

int main()
{
    std::atomic<double> myDoubleAtomic  {23.45};

    assertVariableHasBeenSet( myDoubleAtomic,   "myDoubleAtomic" );
}
Run Code Online (Sandbox Code Playgroud)

我得到这个编译器错误:

getType.cpp: In function ‘int main()’:
getType.cpp:14:61: error: use of deleted function ‘std::atomic<_Tp>::atomic(const std::atomic<_Tp>&) [with _Tp = double]’
  assertVariableHasBeenSet( myDoubleAtomic, "myDoubleAtomic" );
                                                             ^
In file included from getType.cpp:2:0:
/usr/local/include/c++/4.9.4/atomic:169:7: note: declared here
       atomic(const atomic&) = delete;
       ^
getType.cpp:4:27: error:   initializing argument 1 of ‘void assertVariableHasBeenSet(T, const char*) [with T = std::atomic<double>]’
Run Code Online (Sandbox Code Playgroud)

如何传递std::atomic<double>对专用模板的引用?在正常功能中,它是可能的.

son*_*yao 5

对于这种情况,T将被推断为std::atomic<double>,而不是std::atomic<double> &.然后将始终调用主模板而不是专门化.

您可以明确指定模板参数,例如

assertVariableHasBeenSet<std::atomic<double> &>(myDoubleAtomic, "myDoubleAtomic");
Run Code Online (Sandbox Code Playgroud)

或者申请重载.

template<typename T> void assertVariableHasBeenSet( T, const char * );

void assertVariableHasBeenSet( std::atomic<double> & myDouble, 
                               const char * variableName 
                             )
{
    printf( "Double:%s=%f\n", variableName,  myDouble.load() );
}
Run Code Online (Sandbox Code Playgroud)

  • @AlBundy是函数模板重载对于大多数情况来说非常好用,所以不要忘记它. (2认同)