Можно ли указать массив const char, который не заканчивается на '\0'
, отдельно от строки в стиле C во время компиляции?
Скажем, я хочу написать два конструктора для класса.
Один конструктор строит из строки в стиле C, которая заканчивается на '\0'
.
Другой конструктор с другим поведением создает из массива const char, который не заканчивается на '\0'
.
В качестве минимального примера рассмотрим
#include <cstddef>
#include <iostream>
struct Foo
{
Foo(const char *)
{
std::cout << "a C-style string" << std::endl;
}
// Question: How to modify Foo so that a const char array that does not
// ends with '\0' will go to a different constructor?
template<size_t N>
Foo(const char (&)[N])
{
std::cout << "a const char array "
"that does not ends with '\\0'" << std::endl;
}
};
int main()
{
Foo("a C-style string"); // print "a C-style string"
const char a[3] {'a', 'b', 'c'};
Foo foo(a); // print "a C-style string" - can it change?
return 0;
}
Скомпилировано с помощью g++ -std=c++17
.
Вопрос: Есть ли способ достичь этого?
Возможно, я мог бы применить методы SFINAE, но я не понял, как это сделать.
Примечание. В настоящее время есть несколько похожих, но не идентичных вопросов по StackOverflow. Я не нашел ни одного, который прямо отвечает на мой вопрос.