gpt4 book ai didi

c++ - 使用类属性调用具有非类型模板参数的模板函数

转载 作者:行者123 更新时间:2023-11-30 01:06:54 30 4
gpt4 key购买 nike

假设您有一个名为 Funcenum class,一个具有 Func 属性的类和一个 Functions 类包含函数模板 compute:

enum class Func
{
Sin,
Cos
// Others...
}

class Functions
{
public:

template<Func fn>
static inline double compute(const std::vector<double>& _args);
}

template<>
inline double compute<Func::Sin>(const std::vector<double>& _args)
{
return std::sin(std::accumulate(_args.begin(), _args.end(), 0.0));
}


template<>
inline double compute<Func::Cos>(const std::vector<double>& _args)
{
return std::cos(std::accumulate(_args.begin(), _args.end(), 0.0));
}

// More specialisations...

class Foo
{
private:

Func func;
double result;

public:

inline void compute(const std::vector<double>& _args)
{
result = Functions::compute<func>(_args);
// A few other operations follow.
}
}

我想通过传递 func 属性从 Functions 调用适当的专用模板。但是,这不起作用,因为 func 在编译时是未知的。我在 clang 中收到以下错误:

candidate template ignored: invalid explicitly-specified argument for template parameter 'fn'
^

我相信我可以通过将 Foo 中的 compute 方法也作为模板并专门针对每个 Func 来实现:

class Foo
{
private:

Func func;
double result;

public:

template<Func fn>
inline void compute(const std::vector<double>& _args)
{
result = Functions::compute<fn>(_args);
// A few other operations follow.
}
}

template<>
inline void compute<Func::Sin>()(const std::vector<double>& _args)
{
result = Functions::compute<Func::Sin>(_args);
}

template<>
inline void compute<Func::Cos>()(const std::vector<double>& _args)
{
result = Functions::compute<Func::Cos>(_args);
}

// Etc.

但是,这违背了目的,因为我想在 Foo 中使用 func 属性。此外,我想避免双重处理,因为 Foo::compute() 执行了更多操作,我必须将这些操作复制到每个特化中。

有没有办法通过使用func属性来实现这个功能?

最佳答案

模板解析是一种完全编译时的机制。在这种情况下,您需要一些方法来在运行时选择调用哪个函数:函数指针、虚函数、switch 语句...

使用函数指针的例子:

typedef double (*Func)(const std::vector<double>&);

double Sin(const std::vector<double>& args) {
return std::sin(args[0]);
}
// etc.

class Foo
{
private:

Func func;
double result;

public:

inline void compute(const std::vector<double>& _args)
{
result = func(_args);
// A few other operations follow.
}
}

关于c++ - 使用类属性调用具有非类型模板参数的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45453446/

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