无条件匹配模板
Match template unconditionally
我想调用模板函数,即使 std::enable_if_t
没有解析为 true
。它允许我在其他上下文中重用我现有的模板之一。
最小示例:
#include <iostream>
#include <type_traits>
template<typename T,
typename = typename std::enable_if<std::is_same<T, int>::value>::type>
auto foo(T t) {
std::cout << t << std::endl;
return t;
}
template<typename T>
auto bar(T t) {
foo(t);
}
int main() {
int i = 42;
foo(i); // ok already
// foo("42"); // shouldn't
bar("42"); // should
}
我试图通过在 foo
的模板参数列表中声明一个 bool
并在 bar
中调用 foo
时指定它来解决它,但我没有完全设法在不改变 foo
在已经存在的代码中被调用的方式的情况下编译它。
有什么办法可以做到这一点吗?也许 std::disjunction
?
你想要的没有意义。对 foo
的调用要么有效,要么无效。谁做的应该无关紧要。 enable_if
用于防止特定参数 无法 工作(或者您有可以使用的替代定义)的情况。例如,如果定义要使用复制构造函数,但类型没有。您在此处使用它的目的不适合该用例。
如果您确实需要这样做,您可以将 foo
的逻辑提取到 foo
和 bar
都调用的单独函数中。
使用 this SFINAE 技术,您可以通过不使用默认模板参数(因此不使用推导)为“禁止”类型调用 foo
:
template<typename T>
auto bar(T t) {
return foo<T,void>(t);
}
这当然有时被引用为默认类型模板参数 SFINAE 的弱点,以及它无法约束多个其他等效的重载。
我想调用模板函数,即使 std::enable_if_t
没有解析为 true
。它允许我在其他上下文中重用我现有的模板之一。
最小示例:
#include <iostream>
#include <type_traits>
template<typename T,
typename = typename std::enable_if<std::is_same<T, int>::value>::type>
auto foo(T t) {
std::cout << t << std::endl;
return t;
}
template<typename T>
auto bar(T t) {
foo(t);
}
int main() {
int i = 42;
foo(i); // ok already
// foo("42"); // shouldn't
bar("42"); // should
}
我试图通过在 foo
的模板参数列表中声明一个 bool
并在 bar
中调用 foo
时指定它来解决它,但我没有完全设法在不改变 foo
在已经存在的代码中被调用的方式的情况下编译它。
有什么办法可以做到这一点吗?也许 std::disjunction
?
你想要的没有意义。对 foo
的调用要么有效,要么无效。谁做的应该无关紧要。 enable_if
用于防止特定参数 无法 工作(或者您有可以使用的替代定义)的情况。例如,如果定义要使用复制构造函数,但类型没有。您在此处使用它的目的不适合该用例。
如果您确实需要这样做,您可以将 foo
的逻辑提取到 foo
和 bar
都调用的单独函数中。
使用 this SFINAE 技术,您可以通过不使用默认模板参数(因此不使用推导)为“禁止”类型调用 foo
:
template<typename T>
auto bar(T t) {
return foo<T,void>(t);
}
这当然有时被引用为默认类型模板参数 SFINAE 的弱点,以及它无法约束多个其他等效的重载。