c++ std::enable_if .... else?
c++ std::enable_if .... else?
#include <stdio.h>
#include <type_traits>
void print()
{
printf("cheers from print !n");
}
class A
{
public:
void print()
{
printf("cheers from A !");
}
};
template<typename Function>
typename std::enable_if< std::is_function<
typename std::remove_pointer<Function>::type >::value,
void >::type
run(Function f)
{
f();
}
template<typename T>
typename std::enable_if< !std::is_function<
typename std::remove_pointer<T>::type >::value,
void >::type
run(T& t)
{
t.print();
}
int main()
{
run(print);
A a;
run(a);
return 0;
}
上面的代码按预期编译和打印:
来自印刷品的欢呼! 来自A的欢呼!
我想表达的是:"如果模板是函数,那么应用这个函数,否则......"。或者另一种表述:函数模板有一个函数版本,非函数模板有一个默认版本。
因此,这部分似乎有些多余,可以用"else"条件"替换":
template<typename T>
typename std::enable_if< !std::is_function<
typename std::remove_pointer<T>::type >::value,
void >::type
run(T& t)
这会存在吗?
你要找的是 constexpr if。 这将让你编写代码,如
template<typename Obj>
void run(Obj o)
{
if constexpr (std::is_function_v<std::remove_pointer_t<Obj>>)
o();
else
o.print();
}
现场示例
如果您无权访问 C++17,但有 C++14,则至少可以使用变量模板缩短需要编写的代码。 那看起来像
template<typename T>
static constexpr bool is_function_v = std::is_function< typename std::remove_pointer<T>::type >::value;
template<typename Function>
typename std::enable_if< is_function_v<Function>, void>::type
run(Function f)
{
f();
}
template<typename T>
typename std::enable_if< !is_function_v<T>, void>::type
run(T& t)
{
t.print();
}
现场示例
如果您仅限于使用 C++11,则可以使用标记调度机制。
namespace detail
{
template<typename Function>
void run(std::true_type, Function& f)
{
f();
}
template<typename Object>
void run(std::false_type, Object& o)
{
o.print();
}
} // namespace detail
template<typename T>
void run(T& t)
{
constexpr bool t_is_a_function =
std::is_function<typename std::remove_pointer<T>::type >::value;
using tag = std::integral_constant<bool, t_is_a_function>;
detail::run(tag{}, t);
}
工作示例。
相关文章:
- 在 C++ 中的 if-else if- else 语句期间更改变量
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 我需要把 constexpr 放在 else-if 之后吗?
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 如何在 C++17 中将 "else-if" 与初始值设定项一起使用?
- if, else if, else 函数未准确显示结果
- 使用 if/else if 的函数输出问题
- 需要消除这些"else if"并优化代码
- 不必要的 else 语句:当可以使用 IF 时,使用 ELSE IF 有什么缺点吗?
- MQL4:我的if/else if liop只有一半导致当前执行
- 如何在 else-if 语句中正确使用 or 语句 (||)
- if else-if else 语句 c++ 的替代项
- 具有"else if"方法问题 C++ 的基本计算器
- 如果/else-if语句将如何处理此操作
- If和else-If语句.它是如何在下面的代码中工作的
- 优化代码/实现"for"循环而不是长"if - else if - else"
- "if"块没有大括号,使后续"else if"嵌套
- 试图编写一个只使用if和else-if语句对两个数字进行排序的程序
- if else-if梯形图和编译器优化
- C++在else/if中声明一个优先级队列