gpt4 book ai didi

c++ - 使用 enable_if 或类似的东西模板结构标签部分特化

转载 作者:太空狗 更新时间:2023-10-29 23:10:49 25 4
gpt4 key购买 nike

我正在寻找一种方法来使用 std::enable_if 或类似的东西来扩展一个已经存在的定制点,它可以像 A<T> 一样工作。下面的特化(只是一个虚拟的例子):

// customisation point structure in external lib
template<typename T>
struct A
{
typedef T type;
};

//---------------------------------------------
#include <vector>

template <typename T>
concept bool Floating = std::is_floating_point<T>::value;

// specialisation with enable_if style that doesn't require change to external lib
template<Floating T>
struct A<T>
{
typedef std::vector<T> type;
};

int main()
{
static_assert(std::is_same<A<int>::type, int>::value, "");
static_assert(std::is_same<A<float>::type, std::vector<float>>::value, "");

return 0;
}

问题是我有以下限制:

  • 结构A不能修改为接受两个模板参数template<typename T, typename = void>因为这个结构是在外部库中定义的
  • 不能精简地使用概念(因为有些人认为有必要将其标准化推迟到 future 几年...)
  • 不想用 A<type_mod<float>> 之类的东西弄乱所有调用站点上的代码因为那会很丑陋且容易出错(宏使用也是如此)
  • 不想编写外部代码生成器

我怀疑这是否可能,但我记得过去有人说不需要精简概念,因为它们或多或少可以用元编程来模拟,所以我希望有人能证明我是错的。

最佳答案

为确保我正确理解问题,您是否正在寻找与您发布的代码等效的东西,但仅使用 C++14(无概念)?

我认为您提到的第一个限制(“不能修改结构 A 以接受两个模板参数”)是最大的问题。我不知道有什么方法可以在不使用概念的情况下一次为整个“类”类型(例如浮点类型)专门化现有的单参数模板。

所以我认为对你的问题的严格回答是,“不,这是不可能的。”

如果能修改A的第一个声明,那就简单多了。就个人而言,我觉得有时候对于以“我无法修改这个外部库”开头的问题,最好的回答是,“去找出如何修改它,然后回来再问你的问题。”

我在下面提供了一个替代解决方案的想法,但您的问题中缺少太多信息,无法说明它是否适合您。

我假设此外部库会引入您提供的一些 header 以查看您的特化,并且您将在更改该 header 时重新编译该库。 (如果不是这种情况,请编辑您的问题以更好地解释情况。)

在您要放置特化的同一个标题中,您可能会考虑使用一些老式的预处理器技巧作为解决方法。这很丑陋,您必须注意 #include 语句的顺序,但它可能会为您完成工作:

// customisation point structure in external lib
template<typename T>
struct A
{
typedef T type;
};

//---------------------------------------------
#include <vector>

template<typename T, bool is_float>
struct Av2impl
{
typedef T type;
};

template<typename T>
struct Av2impl<T, true>
{
typedef std::vector<T> type;
};

template<typename T>
struct Av2
{
typedef typename Av2impl<T, std::is_floating_point<T>::value>::type type;
};

// force all code after this point to use Av2 instead of A
#define A Av2

int main()
{
static_assert(std::is_same<A<int>::type, int>::value, "");
static_assert(std::is_same<A<float>::type, std::vector<float>>::value, "");

return 0;
}

关于c++ - 使用 enable_if 或类似的东西模板结构标签部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54749968/

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