代码之家  ›  专栏  ›  技术社区  ›  rad i

不明确的函数模板

  •  1
  • rad i  · 技术社区  · 7 年前

    如果应用于返回类型,我想通过enable_选择一个特定的函数模板。

    一个简单的例子是区分有符号和无符号参数。

    #include <iostream>
    #include <type_traits>
    
    template<typename T>
    typename std::enable_if<std::is_signed_v<T>, bool>
    foo(T t)
    {
      return true;
    }
    
    template<typename T>
    typename std::enable_if<!std::is_signed_v<T>, bool>
    foo(T t)
    {
      return false;
    }
    
    int main(){
      std::cout << foo<uint32_t>(42) << std::endl;
    
      return 0;
    }
    

    这里我得到编译器错误: call of overloaded ‘foo<uint32_t>(int)’ is ambiguous std::cout << foo<uint32_t>(42) << std::endl;

    我知道如果我用 foo(42) 因为42可以转换成有符号的无符号。但是,如果像我的示例那样显式地指定template参数,我希望它能够工作。

    我的代码有什么问题,我该如何解决?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Tyker    7 年前

    你错过了 ::type 在你的最后 enable_if 所以即使条件为假也不会出错

    你可以用 enable_if_t 或添加 ●类型 喜欢

    typename std::enable_if<std::is_signed_v<T>, bool>::type
    
        2
  •  1
  •   Marco A.    7 年前

    泰克已经回答你失踪了 ::type enable_if .

    顺便说一句,你可以通过使用 std::enable_if_t ( since C++14 )

    template<typename T>
    std::enable_if_t<std::is_signed_v<T>, bool>
    foo(T t)
    {
      return true;
    }
    
    template<typename T>
    std::enable_if_t<!std::is_signed_v<T>, bool>
    foo(T t)
    {
      return false;
    }