Я предполагаю, что основная предпосылка этого вопроса заключается в том, что я пытаюсь использовать enable_if
вместе с поиском, зависящим от аргумента (ADL), но я не уверен, возможно ли это. Я вижу на этой странице, что
Вывод аргумента шаблона происходит после поиска имени шаблона функции (который может включать поиск, зависящий от аргумента) и до подстановки аргумента шаблона (который может включать SFINAE) и разрешения перегрузки.
Так что я полагаю, что это не сработает, но в духе обучения я хотел бы задать вопрос.
Вот пример того, что я пытаюсь сделать:
#include <iostream>
namespace lib1 {
template <typename T>
void archive(T & t)
{
serialize(t);
}
}
namespace lib2 {
struct VectorInt {
int x;
int y;
};
struct VectorDouble {
double x;
double y;
};
template<typename T>
void serialize(std::enable_if<std::is_same<T, VectorInt>::value, T>::type & vect) {
std::cout << vect.x << std::endl;
}
// maybe do something different with VectorDouble. Overloading would work,
// but I'm curious if it can be made to work with enable_if
}
int main() {
lib2::VectorInt myvect;
myvect.x = 2;
lib1::archive(myvect);
}
Пример основан на том, что я пытаюсь сделать с библиотекой злаков. В моем случае у меня есть несколько различных типов векторов и матриц, и хотя я могу использовать перегрузку для правильного разрешения функций, мне было любопытно использовать функцию enable_if
, чтобы посмотреть, смогу ли я сократить код.
Во всяком случае, попытка скомпилировать это дает сообщение «ошибка: переменная или поле« сериализация »объявлены недействительными».
Насколько я понимаю, это не сработает, потому что enable_if
оценивается только после поиска, зависящего от аргумента? Это правильно?
Для тех, кто хочет поиграть с этим, у меня есть код на repl.it: https://repl.it/repls/HalfBlandJumpthreading
T
не подлежит вычету и не предоставляется дляserialize
. - person Jarod42   schedule 17.03.2018void serialize(VectorInt& vect)
кажется проще. - person Jarod42   schedule 17.03.2018serialize
таким же образом для пары типов с одинаковыми переменными-членами, но по-разному для других типов. Надеюсь, это имеет смысл. - person Nickolai   schedule 17.03.2018enable_if
? Я также не понимаю, почему это вообще работает, поскольку второй аргумент шаблона не используется? - person Nickolai   schedule 17.03.2018::type
внутри структурыenable_if
, но она не существует, потому что условие было ложным, и поэтому он просто записывает это как подстановку. неудача и движение дальше? - person Nickolai   schedule 17.03.2018