Boost logo

Boost :

Subject: Re: [boost] [string_ref] string literal constructor
From: Antony Polukhin (antoshkka_at_[hidden])
Date: 2013-11-03 01:49:11


2013/11/3 Michael Marcin <mike.marcin_at_[hidden]>

> On 11/2/2013 9:43 AM, Marshall Clow wrote:
>
>> On Nov 1, 2013, at 4:42 PM, Michael Marcin <mike.marcin_at_[hidden]> wrote:
>>
>> I noticed string_ref doesn't have a constructor for a string literal.
>>> Wouldn't this save a call to strlen for a common case?
>>>
>>> Ex.
>>>
>>> template< std::size_t N >
>>> basic_string_ref( const charT( &str )[N] )
>>> : basic_string_ref( str, N-1 )
>>> {
>>> static_assert(N >= 1, "not a string literal");
>>> }
>>>
>>> string_ref test( "test" );
>>>
>>
>> So, what should
>> string_ref ( "test\0test" )
>> do?
>>
>> { ptr, 4 } --> current behavior
>> { ptr, 9 } --> your suggested behavior
>>
>>
> So, what should
>
> const char s[] = {'0', '1', '2'};
> string_ref test{s};
>
> do?
>
> Neither seems to be very important and can be handled by requiring sane
> preconditions.

Marshall, how about adding the following constructor:

template< std::size_t N >
basic_string_ref( const charT( &str )[N] )
    : basic_string_ref( str, std::min(N, strlen(str)) ) /* pseudo code,
we'll need something like strlen_s */
{}

Such constructor won't change the current behavior

string_ref ( "test\0test" ) // { ptr, 4 }

but will also work for non-zero terminated fixed length arrays:

const char s[] = {'0', '1', '2'};
string_ref test(s); // {ptr, 3}

-- 
Best regards,
Antony Polukhin

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk