gpt4 book ai didi

c++ - 在函数的模板参数上分支?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:21 26 4
gpt4 key购买 nike

我有一个模板函数,有一次我想根据模板参数使用不同的代码:

template <typename T>
void function(const T &param) {
// generic code here...

// pseudo-code:
if constexpr isinstance(param, Banana) {
param.peel();
} else if constexpr isinstance(param, Apple) {
// do nothing, Apple has no method `peel`
}
}

我不想专门化整个函数,因为大部分代码都是共享的。我要插入的语句实际上是一种临时调试措施。我知道正确的做法是创建一个重载函数 doPeel 并改为调用它:

void doPeel(const Banana &param) { param.peel(); }
void doPeel(const Apple &param) {}

但我很好奇,有没有办法在编译时告诉一个函数,给定变量是什么(模板特化)类型...以便使用只针对一种类型编译的语句?

我想知道 constexpr 是否可以实现类似的东西——或者编译器是否在丢弃的分支中强制执行类型?我还尝试用 lambdas 做一些事情——为两种情况定义 lambdas 并且只调用一个,但我找不到一种方法来做到这一点。有什么想法吗?

最佳答案

C++17中有if constexpr:

template<typename T>
void foo(T const& t)
{
if constexpr(is_same<decay_t<T>, int>::value) {
cout << __PRETTY_FUNCTION__ << " " << t * 2 << endl;
} else {
cout << __PRETTY_FUNCTION__ << endl;
}
}

live demo


在 C++14 中你可以破解这样的东西:

template<typename T>
void foo(T const& t)
{
conditional_eval<is_same<decay_t<T>, int>>([=](auto){
cout << __PRETTY_FUNCTION__ << " " << t * 2 << endl;
},[](auto){
cout << __PRETTY_FUNCTION__ << endl;
});
}

conditional_eval 定义为:

template<typename IfTrue, typename IfFalse>
void conditional_eval_impl(std::true_type, IfTrue&& t, IfFalse&&) {
t(0);
}

template<typename IfTrue, typename IfFalse>
void conditional_eval_impl(std::false_type, IfTrue&&, IfFalse&& f) {
f(0);
}

template<typename Tag, typename IfTrue, typename IfFalse>
void conditional_eval(IfTrue&& t, IfFalse&& f) {
conditional_eval_impl(Tag{}, std::forward<IfTrue>(t), std::forward<IfFalse>(f));
}

live demo

关于c++ - 在函数的模板参数上分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40215336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com