C++ 只有当两个模板参数相同时,是否有方法重写模板方法匹配?

C++ 只有当两个模板参数相同时,是否有方法重写模板方法匹配?,c++,templates,C++,Templates,我有一个函数调用: template <typename A, typename B> bool foo(); template bool foo(); 我想重写它,这样A和B类型相同的任何调用都会转到一个特殊的函数重写。我在想这样的事情: template<typename A> bool foo<A,A>() { return false; } 模板 布尔福() {返回false;} 然而,这段代码没有编译,我找不到任何可能工

我有一个函数调用:

template <typename A, typename B> bool foo();
template bool foo();
我想重写它,这样A和B类型相同的任何调用都会转到一个特殊的函数重写。我在想这样的事情:

template<typename A>
    bool foo<A,A>() 
      { return false; }
模板
布尔福()
{返回false;}
然而,这段代码没有编译,我找不到任何可能工作的代码。到目前为止,我的方法是显式覆盖所有可能的类型:

template<> bool foo<class1,class1>() { return false; }
template<> bool foo<class2,class2>() { return false; }
template<> bool foo<class3,class3>() { return false; }
template bool foo(){return false;}
模板bool foo(){return false;}
模板bool foo(){return false;}
但这是不雅观的,需要在引入新类时进行维护

谢谢你的想法

编辑: 明确地说,当A与B的类型不同时,我有如下代码:

 template<typename A, typename B> 
 bool foo() {
    Thing<A,B> instance;  // Thing<A,A> is never legal and will not compile
 }
模板
布尔福(){
Thing实例;//Thing永远都是合法的,不会编译
}

(之所以调用代码,是因为我正在尝试所有可能的B与A的组合,反之亦然。我希望通过编译器轻松处理这一问题,而不是在每个B上实现if-then测试,以确保它与A不匹配。也许有更好的方法可以做到这一点,但我认为这种设计会很优雅。)由于不允许部分函数模板专门化(
template bool foo()
),您的尝试无法编译。通常的解决方法是使用重载,因为模板参数通常作为函数参数出现。在您的情况下(无函数参数),如果C++17可用,您可以将
if constexpr
标题一起使用,例如

#include <type_traits>

template <typename A, typename B> bool foo()
{
   if constexpr (std::is_same_v<A, B>)
      return true;
   else
      return false;
}
#包括
模板boolfoo()
{
如果constexpr(std::is_same_v)
返回true;
其他的
返回false;
}

如果您无法访问C++17和
如果无法访问constexpr
,您只需使用标准SFINAE即可:

#include <type_traits>

template <typename A, typename B, std::enable_if_t<!std::is_same<A, B>{}, int> = 0> 
bool foo() { return true; }

template <typename A, typename B, std::enable_if_t<std::is_same<A, B>{}, int> = 0> 
bool foo() { return false; }
#包括
模板=0>
bool foo(){return true;}
模板
bool foo(){return false;}

函数模板部分专门化不存在。您需要以一种或另一种形式使用SFINAE以获得类似的结果。我现在还不是很精通这一点,但是如果
std::enable_
是一个起点(除了语法/语义问题之外)。我通常会尽量避免使用“simple”这个词和SFINAE,但无论如何,+1:)这行不通,因为我实际上需要在另一种情况下执行代码,即无法实例化的代码。如果相同,我需要返回false,如果为true,则返回do something,“do something”将无法编译。@NathanielTagg:Normal if不起作用,但Constexpr if起作用,因为它会丢弃未执行的分支:(编译并返回2,尽管无法实例化对象-在这种情况下,将丢弃else)