C++ 专用模板函数接收文字字符串

Mat*_*ros 5 c++ templates string-literals template-specialization

我正在写一个模板方法,它有很多专业。

class FieldValue
{
public:
   ...
   template< typename T >
   void Set( const T& value );
   ...
};
Run Code Online (Sandbox Code Playgroud)

其中之一是:

template <>
void FieldValue::Set< const char* >( const char* const& value )
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试打电话时

FieldValue fieldValue;
fieldValue.Set( "literal string" );
Run Code Online (Sandbox Code Playgroud)

它需要一个const char[14]长度为的专业化,而"literal string"不是一个const char*

是否有任何解决方法而无需将其转换为const char*

更新

在 Rakete1111 的推荐之后,这就是我所做的:

class FieldValue
{
public:
   ...
   template< typename T >
   void Set( const T& value );

   template< std::size_t N >
   void Set( const char( &value )[ N ] )
   {
     Set( static_cast< const char* >( value ) );
   }
   ...
};
Run Code Online (Sandbox Code Playgroud)

这最终将调用const char*专业化

Rak*_*111 5

如果你问这个课程,我会回答你可以使用部分专业化:

template<std::size_t N>
struct Foo<const char (&)[N]> {};
Run Code Online (Sandbox Code Playgroud)

但这不适用于函数模板。相反,您可以重载它们:

template<std::size_t N>
void FieldValue::Set(const char (&Value)[N]) {}
Run Code Online (Sandbox Code Playgroud)