有沒有辦法從 C 中函式的輸入推斷資料型別?
例子:
template<typename T>
func(T input){
if((std::is_same<T, float>::value))
uint32_t compute;
else if((std::is_same<T, double>::value))
uint64_t compute;
// rest of the function which uses compute value to do necessary computation.
}
我理解當前的宣告,變數的范圍在if條件回圈后消失。所以我添加了一個func_compute并從每個if條件呼叫它。
我想知道,有沒有辦法以更清潔的方式做到這一點?
uj5u.com熱心網友回復:
你可以使用std::conditional:
#include <iostream>
#include <type_traits>
#include <cstdint>
template <typename T>
void func(T input)
{
typename std::conditional<
std::is_same<T, float>::value,
std::uint32_t,
typename std::conditional<
std::is_same<T, double>::value,
std::uint64_t,
void
>::type
>::type compute;
std::cout << sizeof compute << '\n';
}
int main(void)
{
func(1.23);
func(1.23f);
// func(1); // error: variable or field 'compute' declared void
}
可能的輸出:
8
4
uj5u.com熱心網友回復:
C 17constexpr if非常適合您的情況。如果您不介意使用 C 17(盡管我強烈懷疑),還有一種更簡潔的方法:
#include <type_traits>
#include <cstdint>
template<typename T>
void func(T input){
auto compute = [] {
if constexpr (std::is_same_v<T, float>)
return std::uint32_t{};
else if constexpr (std::is_same_v<T, double>)
return std::uint64_t{};
}();
// rest of the function which uses compute value to do necessary computation.
}
演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329035.html
上一篇:C 每個單詞的首字母必須大寫
下一篇:如何在回圈中更改實體屬性的值
