2010-07-22 293 views
2

這可能是一個無用的問題,但它在我腦海中停留了幾個小時。具有未知數量參數的C++模板函數

我想寫一個接受一些(POD)參數的函數,將它們轉換爲字符串並返回並置。例如

template<typename A, typename B> 
string ToString(A a, B b) 
{ 
    stringstream ss; 
    ss << a << b; 
    return ss.str(); 
} 

很容易吧? 但它變得非常艱難(當然,對於我來說)當我想寫與未知的相同的函數的數量。

它甚至有可能嗎?任何解決方案

回答

5

幾乎像:-)

#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 

template<class L,class R> 
struct cons_t 
{ 
    const L &l; const R &r; 
    cons_t(const L &_l, const R &_r) : l(_l),r(_r) {} 
}; 
template<> 
struct cons_t<void,void>{}; 
typedef cons_t<void,void> cons; 

template<class L,class R,class A> 
cons_t< cons_t<L,R>, A> operator , (const cons_t<L,R> &l, const A &arg) 
{ 
    return cons_t< cons_t<L,R>, A>(l,arg); 
} 
void to_stream(stringstream &s, const cons_t<void,void> &) { } 
template<typename L, typename R> 
void to_stream(stringstream &s, const cons_t<L,R> &c) 
{ 
    to_stream(s, c.l); 
    s << c.r; 
} 
template<typename L, typename R> 
string to_string(const cons_t<L,R> &c) 
{ 
    stringstream ss; 
    to_stream(ss,c); 
    return ss.str(); 
} 

#define ToString(...) to_string((cons(),__VA_ARGS__)) 
int main() 
{ 
    cout << ToString(1,2,"Hi There",3.14159); 
} 
+0

令人難以置信! :) 非常感謝你:) – MBZ 2010-07-22 11:48:19

9

在C++ 03中,沒有。所有你能做的就是創造過載不同數目的參數:

template<typename A, typename B> 
string ToString(A a, B b) 
{ 
    stringstream ss; 
    ss << a << b; 
    return ss.str(); 
} 

template<typename A, typename B, typename C> 
string ToString(A a, B b, C c) 
{ 
    stringstream ss; 
    ss << a << b << c; 
    return ss.str(); 
} 

這可以自動的(有點)與Boost.Preprocessor庫。

在C++ 0x中,你可以使用可變參數模板是這樣的:

#include <iostream> 

void f() 
{ 
} 

template <class T, class ... Ts> 
void f(const T& a, const Ts&... args) 
{ 
    std::cout << a; 
    f(args...); 
} 
+3

這是正確的。只有在帶有可變參數模板的C++ 0x中才可以實現。 – Puppy 2010-07-22 10:51:04

1

真實的東西我知道這可能是一個學術問題,所以解決方法可能不是你想要的。

但是。

在現實生活中處理此問題的一種簡單方法是傳入對象的List或Array,而不是具有多個參數。
你知道,像Main()

+0

hhhmmm,我不知道你的意思是由列表或數組。 是否可以創建一個接受_any種data_的列表? 我知道可能是C#中的所有東西都是_object_但是C++呢? – MBZ 2010-07-22 11:50:01

+0

那麼你可以使用一個void指針。然後您必須將其轉換爲方法內部可用的內容,並進行一些檢查以獲取其類型。 或者根據您的應用程序,您可以爲您希望傳入的類放入一個超類。例如<<似乎屬於ostream(注意:我的C++語法現在有點生鏽!) – Jon 2010-07-23 08:52:59

相關問題