假设我们有一个模板化函数,其中一小部分代码取决于模板参数类型。从设计POV(或从任何角度来看),哪个更好!是否使用其他方式通过使用type_traits
(我们可以使用is_same
)或模板特殊化(可以将一小部分放在另一个可以特殊化的函数中)检查参数类型?
template <typename T>
void func(T log) {
// common part
// part dependent on T. We can put this in a separate function which we can specialize.
// or we can do:
// if (std::is_same<T, type1>::value) {
// //code1;
// } else if (std::is_same<T, type2>::value) {
// //code2;
// } else {
// //generic code;
// }
// common part
}
答案 0 :(得分:1)
使用运行时if
是一个坏主意,因为已知所有内容都可以编译时间。这正是您提到的c ++引入constexpr if
的原因。 constexpr if
需要兼容c ++ 17的编译器,在2018年应该是这种情况:-)
template <typename T>
void func(T ) {
std::cout << "common before" << std::endl;
if constexpr (std::is_same<T, int>::value) {
std::cout << "int" << std::endl;
} else if constexpr (std::is_same<T, double>::value) {
std::cout << "double" << std::endl;
} else {
std::cout << "other" << std::endl;
}
std::cout << "common after" << std::endl;
}
int main()
{
func(1);
func(1.1);
func('a');
}
但是有一点需要提一下:如果模板化函数中有很大的“通用”部分,那么无论模板专业化还是constexpr if
都没关系,您将获得该代码的完整副本每个模板实例。因此,最好将该代码移至一个函数,以仅获得一次通用部分。如果编译器认为内联该代码是一个不错的选择,它将做到这一点,并且您将获得两种解决方案的精华。