使用默认参数模拟functionpointer

时间:2018-01-21 22:55:43

标签: c++ function c++11 templates pointers

我想将下面的代码模板化:

attachHelpfunctionPointer(testFunctionXY, testValue);  //attach new function with argument
helpFunctionPointer (test);   //pass the argument

然后在代码的某个地方调用它:

int

如何使用“T”类型的模板替换“Authorization: Negotiate XXX”类型?

2 个答案:

答案 0 :(得分:0)

这样的事情应该有效..

template <typename T>
class Foo {
  std::function<void(T)> f_;
  void setFunc(std::function<void(T)> f, T def = {}) {
    // save
    f_ = [=](T p) {
      // pseudo code follows:
      // if not p
        f(def);
      // else
        f(p);
    };
  }

  void callFunc(T param) {
    f_(param);
  }
}

如果您无法修改方法(即需要像使用自由函数那样将其设置为某个任意对象),那么您需要使用某些类型,例如boost::any(或{{ 1}}如果你有C ++ 17)参数和你的函数测试它..所以签名变成std::any

编辑:错过了默认参数标准,因此稍微修改了保存功能。

答案 1 :(得分:0)

您可以使用模板变量编写与您的示例类似但使用模板化的代码。

不幸的是,它们仅从C ++ 14开始提供。

以示例

template <typename T>
void (* helpFunctionPointer)(T) = nullptr;

template <typename T>
void attachHelpfunctionPointer (void (*fP)(T), T test)
 { helpFunctionPointer<T> = fP; }

以下是一个完整的工作示例

#include <iostream>

template <typename T>
void (* helpFunctionPointer)(T) = nullptr;

template <typename T>
void attachHelpfunctionPointer (void (*fP)(T), T test)
 { helpFunctionPointer<T> = fP; }

void foo (int)
 { std::cout << "foo (int function)" << std::endl; }

void bar (long)
 { std::cout << "bar (long function)" << std::endl; }

int main()
 {
   attachHelpfunctionPointer(foo, 0);
   attachHelpfunctionPointer(bar, 0L);

   helpFunctionPointer<int>(1);
   helpFunctionPointer<long>(1L);
 }

对于C ++ 11,我能想象的最好的是将函数指针包装在模板structclass或类似的东西中(例如,参见Nim的答案)。

一个简化的例子可以基于

template <typename T>
struct funcPtr
 { void (*fp)(T) = nullptr; };

以下是完整的工作(C ++ 11)示例

#include <iostream>

template <typename T>
struct funcPtr
 { void (*fp)(T) = nullptr; };

void foo (int)
 { std::cout << "foo (int function)" << std::endl; }

void bar (long)
 { std::cout << "bar (long function)" << std::endl; }

int main()
 {
   funcPtr<int>  fpi { foo };
   funcPtr<long> fpl { bar };

   fpi.fp(1);
   fpl.fp(1L);
 }