gpt4 book ai didi

c++ - 在模板中引用模板化函数

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

我希望能够为模板中的模板化函数命名。

由于可以使用“模板模板”语法命名模板类,并且可以使用“函数指针”语法命名函数,所以我想知道是否有命名函数的语法(或提案)在模板中而不指定模板。

template<typename t_type>
struct A {
t_type value;
};

template<template<typename> class t_type>
struct B {
t_type<int> value;
};

template<int added>
constexpr int C (int value) {
return value + added;
}

template<int (*function)(int)>
constexpr int D (int value) {
return function(value);
}

// GOAL: Template argument referring to templated function
/*template<template<int> int (*function)(int)>
constexpr int E (int value) {
return function<1>(value);
}*/

int main() {
B<A> tt_good;
int fp_good = D< &C<1> >(0);
/*int fp_fail = E< &C >(0);*/

return 0;
}

对于任何对此功能感兴趣的人来说,一个可能的解决方法是首先将函数 D 包装在一个结构中,调用方法名为(例如)“方法”,将结构作为“模板模板”参数传递给 E,然后然后在 E 中调用“方法”。

我不喜欢这种方法的原因是它需要为可能以这种方式使用的每个可变参数函数提供一个包装器结构。

最佳答案

不幸的是,您不能将函数模板作为模板参数传递。最接近的方法是使用通用仿函数:

#include <iostream>

template <typename F>
void call(F f)
{
f("hello, world\n");
}

int main()
{
call([](auto value) { std::cout << value; });
}

如果您没有 C++14 通用 lambda,您可以手动编写自己的仿函数:

#include <iostream>

template <typename F>
void call(F f)
{
f("hello, world\n");
}

struct print
{
template <typename T>
void operator()(T value) const
{
std::cout << value;
}
};

int main()
{
call(print());
}

关于c++ - 在模板中引用模板化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35985427/

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