我想将下面的代码模板化:
attachHelpfunctionPointer(testFunctionXY, testValue); //attach new function with argument
helpFunctionPointer (test); //pass the argument
然后在代码的某个地方调用它:
int
如何使用“T
”类型的模板替换“Authorization: Negotiate XXX
”类型?
答案 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,我能想象的最好的是将函数指针包装在模板struct
或class
或类似的东西中(例如,参见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);
}