c++继承模板特化

  • 本文关键字:继承 c++ c++ templates
  • 更新时间 :
  • 英文 :


我有一个模板函数,它根据作为模板参数传递的类型做一些事情:

template<class T>
void foo() {
if constexpr (std::is_integral_v<T>) {
//  ...
} else if constexpr ... {
// ...
}
}

这个问题是,我真的不需要为每一个可能的整数类型有一个函数实例化(避免模板代码膨胀),所以我想只有一个实例,需要一个int,如果我们传递类型charshort,它调用int版本。我想这样写:

template<class T>
void foo() {
if constexpr (std::is_same_v<T, int>) { // Only check for `int`, because "lower" types will be converted to int
//  ...
} else if constexpr ... {
// ...
}
}
foo<short>(); // Call `foo<int>`
foo<char>(); // Call `foo<int>`
foo<int>(); // Call `foo<int>`

也许我可以将函数包装在一个结构体中,并有一个扩展struct<int>struct<char>?

注意没有"values"在任何地方,我只有模板参数。

您可以将foo转换为可调用对象,并使用using别名根据T选择不同的实例化,例如:

#include <type_traits>
template<class T>
struct foo {
void operator()() {
if constexpr (std::is_same_v<T, int>) {
//  ...
} else if constexpr ... {
// ...
}
}
};
template<class T>
auto bar = std::conditional_t<std::is_integral_v<T>, foo<int>, foo<T>>();
int main() {
bar<short>(); // Call `foo<int>`
bar<char>();  // Call `foo<int>`
bar<int>();   // Call `foo<int>`
bar<const char*>(); // Call `foo<const char*>`
}

相关内容

  • 没有找到相关文章

最新更新