gpt4 book ai didi

c++ - 混合模板与 std::enable_if_t 和特化

转载 作者:行者123 更新时间:2023-12-01 14:07:04 29 4
gpt4 key购买 nike

编辑:根据反馈重写了提供的代码以帮助说明问题
说我有一个方法 template<T> do_foo(T)并且我纯粹使用 std::enable_if 来使用它定义返回值
这允许我为它写签名,例如

// templates_top.h

template<typename T>
std::enable_if_t<std::is_fundamental<T>::value, int> do_foo(T bb)
{
return 0;
}
我还可以为 do_foo 添加更多定义进一步下降 - templates_top.h不需要对可能进入 do_foo 的所有内容进行 fwd 声明- 什么会调用 do_foo只是必须。
现在说我有几个类的实现 do_foo理想情况下不会在标题中
// templates_a.h
#include "./templates_top.h"
#include "./templates_b.h"

class LocalTypeA {
public:
LocalTypeB* internal_;
};

template<typename T>
std::enable_if_t<std::is_same<T, LocalTypeA>::value, int> do_foo(T bb)
{
// Some detailed business logic
// With recursive do_foo for member
return do_foo<LocalTypeB>(*(bb.internal_));
}

// templates_b.h
#include "templates_top.h"

class LocalTypeB {
public:
bool the_val = false;
};

template<typename T>
std::enable_if_t<std::is_same<T, LocalTypeB>::value, int> do_foo(T bb)
{
// Some detailed business logic here
// specific to LocalTypeB that ideally isn't in a header
// Also not that do_foo is called recursively for the std::is_fundamental type
return do_foo<bool>(bb.the_val);
}
当所有内容都在标题中时,所有这些都可以正常工作。但是现在 - 我们希望将复杂的业务逻辑从标题中移出。
我们不能像 template<> do_foo(LocalTypeB) 那样完全特化它因为没有通用实现 template<typename T> do_foo(T) .如果我们制作通用的 - 那么 std::is_fundamental过载变得模棱两可。
有没有办法让我写这个场景,以便
  • templates_top.h保持对 LocalTypeA/B 的无知及其使用 std::is_fundamental
  • 允许 LocalTypeA/B 的过载移动到各自的 impl 文件,仍然解决 std::enable_if签名函数

  • FWIW - 我的 objective-c ++ 标准是 C++11,但我猜 C++14/17 的特性可能使这成为可能,所以它们也很好。
    值得一提的是——这是对一个我一直难以解释的实际问题的相当大的简化——我正在寻找更多的方法来在更大范围内解决类型冲突的核心问题。
    代码示例 here - 编译为 g++ main_a.cppg++ main_b.cpp

    最佳答案

    函数不能部分特化。

    SFINAE 确实可以用来丢弃过载。

    似乎标签调度在这里更合适:

    template <typename T> struct Tag{};

    template <typename T>
    auto do_foo(Tag<bool>, T data)
    {
    return true;
    }

    template <typename T>
    void do_foo(Tag<void>, T data) = delete;

    // ...

    template <typename R, typename R>
    auto do_foo(T data) -> decltype(do_foo(Tag<R>{}, data))
    {
    return do_foo(Tag<R>{}, data);
    }

    关于c++ - 混合模板与 std::enable_if_t 和特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62447159/

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