Скотт Майєрс опублікував зміст та статус своєї наступної книги EC ++ 11. Він написав, що одним із пунктів у книзі може бути "Уникати std::enable_if
функціональних підписів" .
std::enable_if
може використовуватися як аргумент функції, як тип повернення або як шаблон шаблону або параметр шаблону функції для умовного видалення функцій або класів із роздільної здатності перевантаження.
У цьому питанні показано всі три рішення.
Як параметр функції:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Як параметр шаблону:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
Як тип повернення:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- Якому рішенню слід віддати перевагу і чому я повинен уникати інших?
- У яких випадках "Уникати
std::enable_if
підписів функції" стосується використання типу повернення (що не є частиною звичайного підпису функції, а спеціалізації шаблону)? - Чи існують відмінності у шаблонах функцій членів та інших членів?
std::enable_if
захаращувати свої підписи функції (особливо некрасива додаткова nullptr
версія аргументу функції), тому що це завжди виглядає, що це таке, дивний хак (для чогось static if
можливого робити набагато красивіше та чистіше), використовуючи чорну магію шаблону, щоб використовувати цікаву мову. Ось чому я віддаю перевагу диспетчеризації тегів, коли це можливо (ну, ви все ще маєте додаткові дивні аргументи, але не в публічному інтерфейсі, а також набагато менш некрасиві та виразні ).
=0
в typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
досягти? Я не зміг знайти правильних ресурсів, щоб зрозуміти це. Я знаю, що перша частина раніше =0
має тип члена, int
якщо U
і int
є однаковою. Велике дякую!