我正在某些大型庫中添加新模塊。這裏的所有方法都以靜態方式實現。讓我簡要介紹一下簡化模型:在方法中注入附加數據
typedef std::vector<double> TData;
double test (const TData &arg) { return arg (0) * sin (arg (1) + ...;}
double (* p_test) (const TData> &arg) = &test;
class A
{
public:
static T f1 (TData &input) {
.... //some computations
B::f2 (p_test);
}
};
裏面f1()
一些計算,執行和靜態方法B::f2
被調用。 f2
方法由另一個作者實現,並表示一些仿真算法(此處的示例已簡化)。
class B
{
public:
static double f2 (double (* p_test) (const TData &arg))
{
//difficult algorithm working p_test many times
double res = p_test(arg);
}
};
的f2
方法有一個指針指向一些權重函數(這裏p_test
)。但在我的情況下f1
爲test()
方法計算一些額外的參數需要
double test (const TData &arg, const TData &arg2, char *arg3....) { }
如何將這些參數注入test()
(依此來f2
),以避免改變的f2
方法的源代碼(即不平凡),重新設計圖書館並且沒有骯髒的黑客:-)?
最簡單的步驟是覆蓋f2
static double f2 (double (* p_test) (const TData &arg), const TData &arg2, char *arg3.... )
但是以後怎麼辦?考慮一下,這些方法是靜態的,所以對象會有問題。
更新問題
是否有可能使一個指針的函數依賴於一些模板參數或做類似的東西
if (condition) res = p_test(arg);
else res = p_test2(arg, arg2, arg3);
@ DeadMG:謝謝,它看起來像一個有趣的想法...... – justik
如果編譯器支持線程安全的異常,那麼很可能它也支持。提升線程。所以,清理者可以直接使用線程本地存儲。如果編譯器不支持線程安全異常(並且C++ 03標準支持線程中沒有任何內容),那麼這種技術雖然在技術上很有趣,但不是可移植的*。 –
@乾杯和hth。 - Alf謝謝你的重要評論。 – justik