gpt4 book ai didi

C++ typedef 重命名函数

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

我希望能够 typedef 函数,以便能够将模板元编程用作函数选择器(如下例所示)。我也试过将函数作为模板参数传递。在这两种情况下,都会出现错误,因为函数不是类型。我知道如果它们是仿函数,这些方法中的任何一种都会起作用,但我希望能够有一个通用的解决方案。

是否有一种我不知道的“typedef 函数”的实际方法,但使用不同的名称?

编辑:

此时我的用例是我希望能够在使用 boost::property_tree::xml_parser::read_xmlboost::property_tree::json_parser 之间进行选择: :read_json 。但它不仅限于这种情况,使用成员函数、函数指针或 std::function 将需要找到所有确切的函数定义并将其复制到正确 创建一个选择器。

描述用例的更通用的方法是使用 typedef double my_float,以便稍后可以通过一次编辑更改所有代码。或者,更高级的是,typedef 可以在 metaprogam 选择器中定义。

void foo1() { /*do stuff*/ }
void foo2() { /*do other stuff*/ }

template <bool SELECT>
struct Selector {
typedef foo1 foo;
};

template <>
struct Selector<false> {
typedef foo2 foo;
};

最佳答案

另外两个解决方案:

1) C++03解决方案:常量静态函数指针作为类模板的成员

typedef void (*Foo)();

template <bool>
struct Selector
{
static const Foo foo;
};

template <bool select>
const Foo Selector<select>::foo = foo1;

template <>
const Foo Selector<false>::foo = foo2;

// ...

Selector<true>::foo();
Selector<false>::foo();

Live example.

2) C++11解决方案:类模板的常量静态auto成员

template <bool>
struct Selector
{
static constexpr auto foo = foo1;
};

template <>
struct Selector<false>
{
static constexpr auto foo = foo2;
};

// ...

Selector<true>::foo();
Selector<false>::foo();

Live example.

3) C++14解决方案:auto变量模板

template <bool>
constexpr auto foo = nullptr;

template <>
constexpr auto foo<true> = foo1;

template <>
constexpr auto foo<false> = foo2;

// ...

foo<true>();
foo<false>();

Live example.

关于C++ typedef 重命名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25333040/

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