How can I return a pointer to an arbitrary function like thrust::not_equal_to(), or thrust::equal_to()? I cant find the correct type to return
每個您正在試圖返回的東西是兩個參數, 各某種類型的T
,返回bool
的功能。正確的返回類型爲
std::function<bool(T, T)>
如:
#include <thrust/functional.h>
#include <functional>
#include <string>
template<typename T>
std::function<bool(T, T)>
get_filter_operator(const std::string &op)
{
if (op == "!=")
return thrust::not_equal_to<T>();
else if (op == ">")
return thrust::greater<T>();
else if (op == "<")
return thrust::less<T>();
else if (op == ">=")
return thrust::greater_equal<T>();
else if (op == "<=")
return thrust::less_equal<T>();
else
{
return thrust::equal_to<T>();
}
}
#include <iostream>
using namespace std;
int main()
{
auto relop = get_filter_operator<int>("!=");
cout << boolalpha << relop(1,0) << endl;
cout << boolalpha << relop(1,1) << endl;
return 0;
}
現在,您可能希望您的評論再次重申對@MohamadElghawi:
Yeah, I knew that worked, but the problem is that I'm trying to return a thrust::binary_function, not from std
這可能是你是什麼試圖去做,但這是錯誤的事情,試圖做和不可能做的事情。請參閱<thrust/functional>
中的 template<typename A1, typename A2, typename R> struct thrust::binary_function
以及相關文檔的定義。注:
binary_function is an empty base class: it contains no member functions or member variables, but only type information
特別是thrust::binary_function<A1,A2,R>
沒有operator()
。 它不可調用。它不能存儲任何其他可調用對象(或任何東西)。另見equal_to
,not_equal_to
, 等在同一文件中的定義。binary_function
不是它們中的任何一個的基礎。 沒有從任何人轉換到binary_function
。
注太:
binary_function is currently redundant with the C++ STL type std::binary_function. We reserve it here for potential additional functionality at a later date.
(std::binary_function
本身不贊成使用C++ 11和將在C++ 17被移除)。
thrust::binary_function<T,T,bool>
不是你要找的。 std::function<bool(T, T)>
是。
std::function<bool(int, int)> f = thrust::greater<int>();
使得f
封裝一個可調用的對象,它是一個thrust::greater<int>
後來
The problem with this is that it can only be used in host code doesnt it? The beauty of thrust binary functions is that they can be used both in the GPU and the CPU.
我想你可能是下的印象是,例如
std::function<bool(int, int)> f = thrust::greater<int>(); /*A*/
需要thrust::greater<int>
和以某種方式降級它變成一個 std::function<bool(int, int)>
具有類似但更受限 (「STD」)的執行能力。
沒有這樣的情況。一個std::function<bool(int, int)> foo
簡直是 任何bar
是調用帶有兩個參數是隱式 轉換爲int
,並返回一些隱式轉換爲bool
,插座 例如,如果:
std::function<bool(int, int)> foo = bar;
然後當你打電話foo(i,j)
你返回結果,如bool
, 執行bar(i,j)
。不是執行任何與bar(i,j)
不同的任何方式 的結果。
因此,在上述/*A*/
,通過包含的,並且通過被稱爲可調用的東西,f
是 推力二元函數;它是thrust::greater<int>()
。由f
的operator()
調用 的方法是thrust::greater<int>::operator()
。
這裏是一個程序:
#include <thrust/functional.h>
#include <functional>
#include <iostream>
using namespace std;
int main()
{
auto thrust_greater_than_int = thrust::greater<int>();
std::function<bool(int, int)> f = thrust_greater_than_int;
cout << "f "
<< (f.target<thrust::greater<int>>() ? "calls" : "does not call")
<< " a thrust::greater<int>" << endl;
cout << "f "
<< (f.target<thrust::equal_to<int>>() ? "calls" : "does not call")
<< " a thrust::equal_to<int>" << endl;
cout << "f "
<< (f.target<std::greater<int>>() ? "calls" : "does not call")
<< " an std::greater<int>" << endl;
cout << "f "
<< (f.target<std::function<bool(int,int)>>() ? "calls" : "does not call")
<< " an std::function<bool(int,int)>" << endl;
return 0;
}
存儲在一個std::function<bool(int, int)> f
一個thrust::greater<int>
,然後通知您:
f calls a thrust::greater<int>
f does not call a thrust::equal_to<int>
f does not call an std::greater<int>
f does not call an std::function<bool(int,int)>
我可以告訴你這個使用函數的近似值,但它不是真的回答你的問題。 –
我認爲獲得你想要的最直接的方法是編寫一個仿函數,在所需的過濾器運算符上做一個「開關」。我不認爲'推力:not_equal_to'和朋友們在這裏幫助很大。 –
實際上,我最終這樣做了。我想知道是否有一個更優雅的方式 – gumlym