无条件匹配模板

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 的逻辑提取到 foobar 都调用的单独函数中。

使用 this SFINAE 技术,您可以通过不使用默认模板参数(因此不使用推导)为“禁止”类型调用 foo

template<typename T>
auto bar(T t) {
    return foo<T,void>(t);
}

这当然有时被引用为默认类型模板参数 SFINAE 的弱点,以及它无法约束多个其他等效的重载。