首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板函数作为模板参数

模板函数作为模板参数
EN

Stack Overflow用户
提问于 2011-01-15 00:01:14
回答 3查看 18.5K关注 0票数 41

我只是搞不懂如何在C++中以一种通用的方式实现某种东西。有点复杂,让我一步一步地解释。

考虑这类守则:

代码语言:javascript
复制
void a(int) {
    // do something
}
void b(int) {
    // something else
}


void function1() {
    a(123);
    a(456);
}
void function2() {
    b(123);
    b(456);
}

void test() {
    function1();
    function2();
}

很容易注意到,function1function2做同样的事情,唯一不同的部分是内部功能。

因此,我想使function成为通用的,以避免代码冗余。我可以使用函数指针或模板来完成它。现在让我选择后者。我的想法是,这是更好的,因为编译器肯定能够内联的函数-我是正确的吗?如果调用是通过函数指针进行的,编译器仍然可以内联吗?,这是一个附带的问题。

好,回到原点.带有模板的解决方案:

代码语言:javascript
复制
void a(int) {
    // do something
}
void b(int) {
    // something else
}

template<void (*param)(int) >
void function() {
    param(123);
    param(456);
}

void test() {
    function<a>();
    function<b>();
}

一切都好。但我遇到了一个问题:如果ab本身就是泛型,我还能这样做吗?

代码语言:javascript
复制
template<typename T>
void a(T t) {
   // do something
}

template<typename T>
void b(T t) {
   // something else
}

template< ...param... > // ???
void function() {
    param<SomeType>(someobj);
    param<AnotherType>(someotherobj);
}

void test() {
    function<a>();
    function<b>();
}

我知道模板参数可以是以下内容之一:

  • a类型,
  • a模板类型,
  • 类型的值。

这些似乎都不能掩盖我的处境。因此,我的主要问题是:如何解决这个问题,即在最后一个示例中定义function()

(是的,函数指针在这种情况下似乎是一种解决办法-前提是它们也可以内联-但我正在寻找这类问题的通用解决方案)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-15 00:42:11

为了解决模板的这个问题,您必须使用模板参数。不幸的是,您不能将模板函数作为类型传递,因为必须先实例化模板函数。但有一个解决办法与虚拟结构。下面是一个示例:

代码语言:javascript
复制
template <typename T>
struct a {

    static void foo (T = T ())
    {
    }

};

template <typename T>
struct b {

    static void foo (T = T ())
    {
    }

};

struct SomeObj {};
struct SomeOtherObj {};

template <template <typename P> class T>
void function ()
{
    T<SomeObj>::foo ();
    T<SomeOtherObj>::foo ();
}

int main ()
{
    function<a>();
    function<b>();
}
票数 41
EN

Stack Overflow用户

发布于 2019-05-31 17:21:55

对于来自C++14的通用lambda,您可以这样做:

代码语言:javascript
复制
template<typename T> void a(T t) { /* do something */}
template<typename T> void b(T t) { /* something else */ }

template <typename F>
void function(F&& f) {
    f(someobj);
    f(someotherobj);
}

void test() {
    // For simple cases, auto&& is even probably auto or const auto&
    function([](auto&& t){ a(t); });
    function([](auto&& t){ b(t); });

    // For perfect forwarding
    function([](auto&& t){ a(std::forward<decltype(t)>(t)); });
    function([](auto&& t){ b(std::forward<decltype(t)>(t)); });
}

如果调用是通过函数指针发出的,

编译器仍然可以内联它们吗?

他们可以,但它确实更复杂,他们可能会更频繁地失败比函子或模板。

票数 4
EN

Stack Overflow用户

发布于 2011-01-15 00:45:56

代码语言:javascript
复制
template < typename F >
void function(F f)
{
  f(123);
}

void a(int x) { ... }

struct b { void operator() (int x) { ... } };

void outer()
{
  function(&a);
  function(b());
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4697180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档