c++ 如何在使用std::enable_if和constexpr方法时解决“函数模板已定义”问题

cig3rfwq  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(117)

当使用constexpr方法作为std::enable_if_t的参数时,旧的MSVC编译器会抱怨“函数模板已经被定义了”。G++和更新的MSVC编译器接受这一点。我如何使旧的MSCV编译器也能工作?
示例代码:

#include <climits>
#include <iostream>
#include <type_traits>

template <typename NumberType>
constexpr auto doBitCountsMatch(const int f_bitCount) -> bool {

  return (static_cast<int>(CHAR_BIT * sizeof(NumberType)) == f_bitCount);
}

template <typename NumberType, int bitCount>
auto test()
    -> std::enable_if_t<doBitCountsMatch<NumberType>(bitCount), NumberType> {
  std::cout << "Bit counts match." << std::endl;

  return 0;
}

template <typename NumberType, int bitCount>
auto test()
    -> std::enable_if_t<!doBitCountsMatch<NumberType>(bitCount), NumberType> {
  std::cout << "Bit counts don't match." << std::endl;

  return 0;
}

int main() {
  int number = 0;

  test<decltype(number), 32>();
  return 0;
}

在“编译器资源管理器”中:https://godbolt.org/z/15PnPhvo8:MSVC 19.14拒绝代码,MSVC 19.33接受代码。为什么旧的编译器拒绝代码?

dsekswqp

dsekswqp1#

您可以改用std::enable_if_t作为模板参数:

template <typename NumberType, int bitCount,
          std::enable_if_t<doBitCountsMatch<NumberType>(bitCount), int> = 0>
auto test() -> NumberType
{
  std::cout << "Bit counts match." << std::endl;

  return 0;
}

template <typename NumberType, int bitCount,
          std::enable_if_t<!doBitCountsMatch<NumberType>(bitCount), int> = 0>
auto test() -> NumberType
{
  std::cout << "Bit counts don't match." << std::endl;

  return 0;
}

Demo

相关问题