Рассмотрим следующий класс, который проверяет, является ли указанный тип строкой, и использует свойства типа для вызова другой функции на основе результата. Оригинальный источник имеет тип зависимостей от Obj, это упрощенный пример:Определение типа выделения из реализации
template <typename Obj>
class example {
public:
template <bool IdIsString = std::is_same<std::string, Obj>::value>
typename std::enable_if<IdIsString, void>::type
doStuff() {
this->object->doSomething();
}
template <bool IdIsString = std::is_same<std::string, Obj>::value>
typename std::enable_if<!IdIsString, void>::type
doStuff() {
this->object->doSomethingElse();
}
private:
AnyObject object;
};
Как бы идти о развязке определения (например, хранение его в example_inline.hpp) из класса без предоставления каждого типа признака случая Определение?
Идеальное решение будет выглядеть следующим образом:
// header.hpp
template <typename Obj>
class example {
public:
void doStuff();
}
// header_inline.hpp
template <typename Obj>
template <bool IdIsString = std::is_same<std::string, Obj>::value>
typename std::enable_if<IdIsString, void>::type
example::doStuff() {
// ...
}
// ...
выше, очевидно, не представляется возможным. Одним из решений было бы отделить функцию type_trait от класса и поместить его в пространство имен деталей, но это означало бы, что я должен всегда передавать AnyObject (и в этом смысле все объекты, которые модифицируются функцией), чтобы он выглядел не очень элегантный.
Есть ли хорошее решение этой проблемы? Мне бы очень хотелось, чтобы заголовки, о которых идет речь, были легко читаемы, не загромождая их тоннами enable_if.
Спасибо за любой вклад в вопрос.
Как насчет отправки тегов? – dyp
@dyp Не знал об этой идиоме, но это идеальное решение :) Я помету ваш ответ, как прием, если вы хотите уточнить его для других людей, имеющих ту же проблему. – Robin
Как насчет простой 'if'? В вашем примере, похоже, нет зависимости от фактического типа, поэтому оба вызова действительны, и вы можете просто использовать 'if (std :: is_same :: value)' .. –
dyp