我有一個通用的矢量類,我在其中實現了一個接受函子的構造函數。這個想法是調用函數來初始化向量中的每個元素,函子的單個參數是元素索引。通用矢量類中的重載解析問題
然而,這是通過不同類型的標量超過向量的元素類型時,用我的「從標」構造干擾:
template <typename T, int N>
struct SomeVectorClass
{
T values[N];
SomeVectorClass() {}
SomeVectorClass(T scalar)
{
for (int i = 0; i < N; i++) values[i] = scalar;
}
template <typename InitFunctionType>
SomeVectorClass(InitFunctionType initFunction)
{
for (int i = 0; i < N; i++) values[i] = initFunction(i);
}
};
...
SomeVectorClass<int, 2> a([&] (int i) { return i; }); // This works
SomeVectorClass<int, 2> b(123); // This works
SomeVectorClass<int, 2> c(123.f); // This causes error "called object type 'float' is not a function or function pointer"
我期待爲c
是讓編譯器自動轉換123.f
到123
然後調用「從標量」構造函數(在這種情況下接受int
)。
三個問題:
- 由重載決議,因爲它不需要鑄造首選拉姆達構造?
- 有沒有一種方法可以讓
std::enable_if
或類似的黑客工作? - 如果不是,如果
InitFunctionType
是一個仿函數,我將如何使用std::enable_if
來啓用仿函數構造函數?
在此先感謝您的時間!
編輯:忘了提,我不能使用std::function
,出於性能原因。該課程需要內聯友好。
'template :: type> SomeVectorClass(InitFunctionType initFunction)' –