2017-03-02 51 views
0

我想知道是否有方法在以下C++代碼中重用對函數template_fun的調用。在C++中重複使用帶有不同可能類型參數的函數調用

#include <iostream> 
#include <cstdlib> 
#include <ctime> 


template <typename T> 
double template_fun(T arg) 
{ 
    double a = 1.1; 
    a += (double)arg; 
    return a; 
} 

int main() 
{ 
    std::srand(std::time(0)); 
    int r = std::rand() % 2; 
    double out; 

    switch(r) 
    { 
     case 0: 
     { 
      int arg = 1; 
      out = template_fun(arg); 
      break; 
     } 
     case 1: 
     { 
      double arg = 1.2; 
      out = template_fun(arg); 
      break; 
     } 
    } 

    std::cout << out << "\n"; 
} 

由於行out = template_fun(arg);重複,我希望有一種方法來重用它以某種方式。顯然,根據輸入調用具有不同輸入數據類型的模板函數的問題實際上就是我所瞭解的。我正在處理的代碼要複雜得多。我並不特別希望有一個聰明的解決方案,因爲它可能意味着在運行時定義arg的數據類型。但也許我錯過了一些東西。

非常感謝您的幫助!非常感激。

+0

不知道這是有幫助的,因爲你說你的代碼要複雜得多,但你可以用'OUT =( r?template_fun(1):template_fun(1.2));' – NathanOliver

+0

_「由於line out = template_fun(arg);重複,我希望有一種方法可以重用它。」_你能詳細說明這個嗎?你的模板函數按照預期的方式工作。 –

+0

@NathanOliver正如你所說,它不會真的在我的代碼中工作。但無論如何,據我所知,該行需要將'out'定義爲'double',無論如何都會破壞模板的重點。 – Sebolains

回答

0

你可以使用一些variant類,而這樣做:

struct template_fun : boost::static_visitor<double> 
{ 
    template <typename T> 
    double operator() (T arg) const 
    { 
     double a = 1.1; 
     a += (double)arg; 
     return a; 
    } 
}; 

int main() 
{ 
    std::srand(std::time(0)); 
    int r = std::rand() % 2; 
    boost::variant<int, double> arg; 
    double out = 0.0; 

    switch(r) 
    { 
     case 0: { arg = 1; break; } 
     case 1: { arg = 1.2; break; } 
    } 
    out = boost::apply_visitor(template_fun{}, arg); 
    std::cout << out << "\n"; 
} 

Demo

相關問題