我有一个模板函数,它根据作为模板参数传递的类型做一些事情:
template<class T>
void foo() {
if constexpr (std::is_integral_v<T>) {
// ...
} else if constexpr ... {
// ...
}
}
这个问题是,我真的不需要为每一个可能的整数类型有一个函数实例化(避免模板代码膨胀),所以我想只有一个实例,需要一个int
,如果我们传递类型char
或short
,它调用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*>`
}