2008-10-21 75 views
5

這個article描述了一種在C#中的方式,允許添加任何具有爲其定義的+操作符的值類型。從本質上講,它允許下面的代碼:任意值類型的操作

public T Add(T val1, T val2) 
{ 
    return val1 + val2; 
} 

此代碼不能編譯,因爲沒有保證的T型具有的「+」操作符的定義,但效果與代碼實現這樣的:

public T Add(T val1, T val2) 
{ 
    //Num<T> defines a '+' operation which returns a value of type T 
    return (new Num<T>(val1) + new Num<T>(val2)); 
} 

請點擊鏈接查看Num類如何實現此目的。無論如何,在這個問題上。有什麼方法可以在C或C++中實現相同的效果?對於好奇心,我試圖解決的問題是允許CUDA內核更靈活/通用,因爲它允許它在更多類型上運行。

更新:對於.NET,Marc Gravell製作了一個utility library,它非常優雅地解決了操作員問題。

回答

13

由於方式的模板被編譯在C++中,簡單地做:

template < class T > 
T add(T const & val1, T const & val2) 
{ 
    return val1 + val2; 
} 

會的工作,你會得到一個編譯錯誤,其中運營商+沒有定義的每個類型。

C++模板爲每個類型實例化生成代碼,因此對於每個類型,將生成正確的T代碼。這種方式C++不需要任何技巧。

在普通的C中,據我所知,這是不可能的。

+1

值得注意的是,這種方式與C++模板的工作方式已被命名爲「鴨子打字」的類型。基本上,你可以根據自己實際需要的類型進行選擇,而改爲說'需要支持X,Y等方法和操作'。它也被用作ruby中的主要類型機制。 – workmad3 2008-10-21 14:15:59

1

這可以很容易用C來完成++使用模板:但是


template <typename T> 
T Add(T val1, T val2) 
{ 
    return val1 + val2; 
}

注意的是,本必須在頭文件中定義,你可能也想通過通過常量引用參數,而不是的價值。

這根本不能用純C完成。

4

在C++中,這根本不是問題。第一個示例中的代碼如果直接轉換爲C++(ETA:如Pieter那樣),但是我想不出任何直接使用+都不行的情況。您正在尋找一個不存在的問題的解決方案。

0

C++中的模板。在C中,不是沒有大規模的麻煩和開銷。

template<typename T> 
T add(T x, T y) 
{ 
    return x + y; 
} 
1

它也可以在C中完成,但我不確定它是否滿足問題要求,使用宏。

#define ADD(A,B) (A+B) 
+0

不!不要這樣做。在宏中,總是將參數放在圓括號中#define SQUARE(A)((A)*(A))與#define SQUARE(A)(A * A)會給SQUARE(x + y) – 2008-10-21 14:18:45