Скотт Майєрс опублікував зміст та статус своєї наступної книги 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є однаковою. Велике дякую!