Я уже знаю, что вы можете включить (или нет) метод класса за помощью std::enable_if
включить члена класса, в зависимости от шаблона
для Exemple:
template<size_t D, size_t E>
class Field
{
...
size_t offset(const std::array<float,D>& p) const
{
...
}
template<typename TT = size_t>
typename std::enable_if<D!=E, TT>::type
offset(const std::array<float,E>& p) const
{
return offset(_projection(p));
}
...
};
Это помогает не будучи в состоянии вызвать функцию, являются недействительными в конкретном случае, а также с устранением ошибок перегрузки ... что, для меня, очень приятно!
Я хотел бы пойти дальше и сделать некоторые из членов моего класса присутствующими, только если они необходимы. Таким образом, я хотел бы получить ошибку при попытке использовать возразил, которые бы в противном случае не было начато
Я пытался сделать
template<size_t D, size_t E>
class Field
{
...
template<typename TT = projectionFunc>
typename std::enable_if<D!=E, TT>::type _projection;
}
Но компилятор говорит мне:
erreur: data member ‘_projection’ cannot be a member template
Is есть ли способ достичь того, чего я хочу?
Возможно, вы захотите изменить имя из 'offsetof', чтобы кто-то включил перед заголовком и включил макрос. –
chris
Это запланировано, я просто ищу еще одно приятное имя. – Amxx
. Именно этот SFINAE тоже немного ... icky. В случае 'D == E' вы получите« typename std :: enable_if :: type'. Специализацией стандартной формы типа библиотеки является UB, поэтому можно утверждать, что гипотетическая реализация может вызывать правило «недействительной специализации может быть сгенерировано» и называть это плохо сформированным. –