2011-04-06 25 views
0

我有一個模板化函數,其中模板化參數是一個仿函數。我想生成一些特定於特定質量函數的內部變量,以供其他由此函子調用的模板函數使用。所以我嘗試了auto關鍵字,它似乎工作如何在不使用C++的情況下實現此類型的特定對象生成器0x自動

template<typename QF> 
float find_optimal_partition_louvain_with_gain(QF quality_function) { 
    auto internal_variables = gen(quality_function); 
    float result = do_some_work(internal_variables); 
    ... 
    return result; 
} 

struct internals_for_linearised_functor { 
    double x; 
}; 

internals_for_linearised_functor gen(mynamespace::linearised_function &f) { 
    linearised_internals internals; 
    internals.x = 5; 
    return internals; 
} 

與自動這似乎編譯罰款,這是令人愉快的。我想盡量保持在目前的標準之內,以使我的代碼更加便攜。有沒有一種方法可以使用當前標準進行處理,或者這是BOOST_AUTO能夠處理的事情嗎?我想實現一般功能是基於一個對模板paramater的類型的對象,而無需實際傳遞新的對象的類型進入功能(即推斷它)

感謝

+0

那麼'gen'有很多重載,爲不同的函數類型返回不同的內部函數,並且'do_some_work'的相應重載?你可以引入一個traits類模板,以便每次有人重載'gen'時,他們還會添加一個模板專門化模板class internals_type {typedef internals_for_linearised_functor value; }'。然後使用'typename internals_type :: value internal_variables = ...' – 2011-04-06 16:10:46

+0

總是當我看到這些類型的問題時,我想知道OOP對於程序員來說如何更清晰。具有函子參數的類型特定的對象生成器模板函數。真? – orlp 2011-04-06 16:13:51

+0

@nightcracker:我不認爲這段代碼與OOP有很大關係。面向對象的方式將是爲質量函數定義一個接口,如果內部變量不能真正成爲內部變量,那麼我猜想另一個接口。然後在任何地方使用動態多態,所以'find_optimal_partition_louvain_with_gain'不需要知道內部變量的運行時類型,它只能通過接口類型引用它。 – 2011-04-06 16:16:41

回答

2

這應該工作開箱:

template<typename QF> 
float find_optimal_partition_louvain_with_gain(QF quality_function) { 
    return do_some_work(gen(quality_function)); 
} 

如果您需要internal_variables是大約比只是一個通話時間越長,你可以使用另一個小函數來推斷類型:

template<typename QF, typename T> 
float find_optimal_partition_louvain_with_gain_detail(QF quality_function, T internal) { 
    float result = do_some_work(internal); 
    /* use internal and quality_function again here!.*/ 
    return result; 
} 


template<typename QF> 
float find_optimal_partition_louvain_with_gain(QF quality_function) { 
    return find_optimal_partition_louvain_with_gain_detail(
     quality_function, 
     gen(quality_function) 
    ); 
} 

希望這有助於!

+0

+1,模板參數扣除是'auto'的標準回退。 – MSalters 2011-04-07 08:00:40

1

如果你不在這種情況下,您不想使用auto,您需要使用某種元函數(函數特徵,或許)來獲得gen的返回類型。

Boost具有功能特徵,或者您可以針對您的QF類型專門實施特徵類。如果它是一個標準的函數對象類型,它應該有一個result_type的typedef,你可以在使用typedef typename QF::result_type result_type

0

你可以用gen()一個struct內靜態方法,然後更換internal_variables得到什麼?請參閱以下修改的代碼。現在

struct Generate 
{ 
    static internals_for_linearised_functor s_Internals; // define somewhere 
    static void gen(mynamespace::linearised_function &f) 
    { 
    linearised_internals internals; 
    internals.x = 5; 
    s_Internals = internals; 
    } 
}; 

,在功能find_optimal_partition_louvain_with_gain,你可以先打電話Generate::gen()再使用,Generate::s_Internals代替internal_variables

這似乎是更容易的方法來避免知道auto的類型。 另外,如果需要,您可以將Generate設爲template<>。 對於線程安全在上面的代碼中,我們也可以不用static來實現。

相關問題