Шаблон псевдонима C ++ (typedef) с понятиями?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4553.pdf

gcc6: -fconcepts

template<typename T>
concept bool String = requires(T s)
{
{ s.clear() } -> void;
// etc.
};

void print(const String& message);
//void print(Str message); // I want Str = const String&

void test()
{
std::string str;
print(str);
}

Есть ли способ заявить Str как const String&?

4

Решение

Есть ли способ заявить Str как const String&?

И более того, ты не хочешь этого в любом случае. Понятия о добавлении ограничений к типам. Так что если вы хотите ограничить print взять что-то, что моделирует String, Вы можете сделать это:

template <typename T> requires String<T> void print(T const&); // requires-clause
template <String T> void print(T const&); // partial-concept-id
void print(String auto const&); // probably what C++20 will allow

Но ограничение и категория значений являются ортогональными. Вы могли бы взять String по значению:

void print(String auto);

Вы могли бы взять String путем пересылки ссылки:

void print(String auto&&);

Это все отдельные варианты от «Я хочу String«аспект. Вы не можете действительно сгруппировать их вместе.


Лучшее, что вы можете сделать, это:

template <String T> using Str = T const&;
template <typename T> void print(Str<T>); // silently a const&

или же

template <typename T> using CR = T const&;
template <String T> void print(CR<T>); // silently a const&

Это работает. Для некоторого определения работ. Но, как … не делай этого. Тот факт, что функция принимает const& В отличие от значения очень важна визуальная информация, а не просто ее скрывают.

2

Другие решения

Других решений пока нет …