使用模板的条件函数调用
Conditional function invocation using template
有没有一种方法可以使用 C++ 模板(编译时代码生成)有条件地调用函数,其中根据参数的类型,每个变体的逻辑都会不同
例如(不可编译的代码),
template <true, typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3) {//logic type1}
template <false, typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3) {//logic type2}
template <typename Var1, typename Var2, typename Var3>
int foo(Var1 v1, Var2 v2, Var3 v3)
{
func<static_condition>(v1, v2, v3);
}
当使用一些参数调用 foo 时,它将静态评估布尔标志,它应该根据它调用 func。在这两个变体中执行的逻辑将导致编译错误,因此必须为每个操作拆分。
我正在搜索一些示例并使用模板元编程找到了 _If _Then _Else 模式,但我不清楚如何在我的场景中使用它。
没有什么比这更容易了。
template <typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3, std::true_type) {//logic type1}
template <typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3, std::false_type) {//logic type2}
template <typename Var1, typename Var2, typename Var3>
int foo(Var1 v1, Var2 v2, Var3 v3)
{
func(v1, v2, v3, std::integral_constant<bool, static_condition>());
}
您可以使用enable_if
有条件地关闭一个或另一个功能:
template <bool cond, typename Var1, typename Var2, typename Var3>
typename std::enable_if<cond, int>::type
func(Var1 v1, Var2 v2, Var3 v3) {//logic type1}
template <bool cond, typename Var1, typename Var2, typename Var3>
typename std::enable_if<not cond, int>::type
func(Var1 v1, Var2 v2, Var3 v3) {//logic type2}
template <typename Var1, typename Var2, typename Var3>
int foo(Var1 v1, Var2 v2, Var3 v3) {
func<static_condition>(v1, v2, v3);
}
有没有一种方法可以使用 C++ 模板(编译时代码生成)有条件地调用函数,其中根据参数的类型,每个变体的逻辑都会不同
例如(不可编译的代码),
template <true, typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3) {//logic type1}
template <false, typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3) {//logic type2}
template <typename Var1, typename Var2, typename Var3>
int foo(Var1 v1, Var2 v2, Var3 v3)
{
func<static_condition>(v1, v2, v3);
}
当使用一些参数调用 foo 时,它将静态评估布尔标志,它应该根据它调用 func。在这两个变体中执行的逻辑将导致编译错误,因此必须为每个操作拆分。
我正在搜索一些示例并使用模板元编程找到了 _If _Then _Else 模式,但我不清楚如何在我的场景中使用它。
没有什么比这更容易了。
template <typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3, std::true_type) {//logic type1}
template <typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3, std::false_type) {//logic type2}
template <typename Var1, typename Var2, typename Var3>
int foo(Var1 v1, Var2 v2, Var3 v3)
{
func(v1, v2, v3, std::integral_constant<bool, static_condition>());
}
您可以使用enable_if
有条件地关闭一个或另一个功能:
template <bool cond, typename Var1, typename Var2, typename Var3>
typename std::enable_if<cond, int>::type
func(Var1 v1, Var2 v2, Var3 v3) {//logic type1}
template <bool cond, typename Var1, typename Var2, typename Var3>
typename std::enable_if<not cond, int>::type
func(Var1 v1, Var2 v2, Var3 v3) {//logic type2}
template <typename Var1, typename Var2, typename Var3>
int foo(Var1 v1, Var2 v2, Var3 v3) {
func<static_condition>(v1, v2, v3);
}