我想这个问题的基本前提是我试图enable_if
与 Argument Dependent Lookup (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