gpt4 book ai didi

C++:非类型化函数指针

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

如何在不保存返回类型的情况下保存指向函数的指针?
例如:

int GetInt() { return 5; }
string GetStr() { return "abc"; }

FunctionPointerClass GetAny;

int main()
{
GetAny = &GetInt;
auto var = GetAny();

GetAny = &GetStr;
auto var2 = GetAny();

cout << var << '\n' << var2;
}

编辑

一个简单的方法是使用 variant<> (感谢@sehe),像这样:

#include <boost/variant.hpp>
#include <string>
#include <iostream>
#include <functional>

int GetInt() { return 5; }
std::string GetStr() { return "abc"; }

int main()
{
std::function<boost::variant<int, std::string>()> Get;
Get = &GetInt;
std::cout << Get() << '\n';

Get = &GetStr;
std::cout << Get() << '\n';
}

但是,它不太适用于我的项目:非类型类。要使用它,我需要堆叠所有使用过的返回类型,将其放入 variant<> 的模板中.像这样:

class Var {
private:
void* _val;

template <typename T>
T& _Get() const {
return *((T*)_val);
}

// Static stack variable HERE

public:
val() {}

template <typename T>
val(T val) {
Set(val);
}

~val() {
if(_val != nullptr) delete _val;
}

std::function<boost::variant</*Stack*/>()> Get;

template <typename T>
void Set(T val) {
if(_val != nullptr) delete _val;

_val = new T(val);
Get = &_Get<T>;

// TODO Add 'T' to Stack
}
};

我该怎么做?

最佳答案

不完全是。

  • 你当然可以让它成为一个打印值的函数。

  • 或者您可以使用 std::variant/boost::variant返回任一类型。

  • 类型删除等其他技术也可能适用。

我在这里充实了最后两种方法:


使用variant<>

Live On Coliru

#include <boost/variant.hpp>
#include <string>
#include <iostream>
#include <functional>

int GetInt() { return 5; }
std::string GetStr() { return "abc"; }

int main()
{
std::function<boost::variant<int, std::string>()> Get;
Get = &GetInt;
std::cout << Get() << '\n';

Get = &GetStr;
std::cout << Get() << '\n';
}

打印

5
abc

使用类型删除

相关技术是类型删除,您可以在其中定义具有支持操作(在本例中为输出流)的“概念”,并将其隐藏在多态接口(interface)后面。例如:

struct Printable {
template <typename T> Printable(T v) : _stored(new concrete<T>(v)) { }

friend std::ostream& operator<<(std::ostream& os, Printable const& p) {
return p._stored->print(os);
}

private:
struct interface {
virtual std::ostream& print(std::ostream& os) const = 0;
virtual ~interface() = default;
};

template <typename T>
struct concrete : interface {
concrete(T v) : v(v) {}
virtual std::ostream& print(std::ostream& os) const override {
return os << v;
}
T v;
};

std::unique_ptr<interface> _stored;
};

在那种情况下你可以制作整个程序:

Live On Coliru

int         GetInt() { return 5;     }
std::string GetStr() { return "abc"; }

int main()
{
std::function<Printable()> Get;
Get = &GetInt;
std::cout << Get() << '\n';

Get = &GetStr;
std::cout << Get() << '\n';
}

关于C++:非类型化函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46310693/

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