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&
?
Есть ли способ заявить
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&
В отличие от значения очень важна визуальная информация, а не просто ее скрывают.
Других решений пока нет …