class Test
{
public:
SOMETHING DoIt(int a)
{
float FLOAT = 1.2;
int INT = 2;
char CHAR = 'a';
switch(a)
{
case 1: return INT;
case 2: return FLOAT;
case 3: return CHAR;
}
}
};
int main(int argc, char* argv[])
{
Test obj;
cout<<obj.DoIt(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,使用a = 1意味着我需要返回一个整数等的知识,无论如何Doit()可以返回变量数据类型的变量吗?
从本质上讲,我该如何取代SOMETHING?
PS:我正在尝试寻找一种替代方法来返回包含这些数据类型的结构/联合.
我有一个看起来像这样的提升变体: typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;
我需要能够将此变体中的任何值转换为std :: string,我想知道是否有一些我可以使用的模板类型函数来执行此操作?
或者最有效的方法是什么?
我目前正在实现一堆重载函数,每个函数都采用一种类型,然后使用std::stringstream或进行转换,posix_time我会使用它的转换函数.也许有更好的方法?
我有这个当前代码,它将"AAPL"键入到Excel工作表中,并返回相应的值.
我想这样做,以便cout << "Ticker: ";我可以输入一个股票代码(如AAPL)并使用此作为variant_t ticker = "xxx".我尝试通过使用,string但我得到一个错误,说无法转换'std::string to const _variant_t &'是否有反正这样做?提前致谢.
XL->Workbooks->Open(L"F:\\xxx\\Desktop\\fxxxx.xlsx");
Excel::RangePtr pRange = pSheet->Cells;
cout << "Ticker: ";
variant_t ticker = "AAPL";
pRange->Item[2][1] = ticker;
double value = pRange->Item[2][2];
cout << "\n Value = " << value << endl;
Run Code Online (Sandbox Code Playgroud) uses
SysUtils, Variants;
var
VariantSingle: Variant;
VTSingle: TVarType;
SingleTest: Single;
VariantDouble: Variant;
DoubleTest: Double;
VTDouble: TVarType;
begin
SingleTest := 1.234;
VariantSingle := SingleTest;
VTSingle := VarType(VariantSingle) and varTypeMask;
DoubleTest := 1.23456;
VariantDouble := DoubleTest;
VTDouble := VarType(VariantDouble) and varTypeMask;
WriteLn(Format('VarType: Single: %d, Double %d', [VTSingle, VTDouble]));
end.
Run Code Online (Sandbox Code Playgroud)
上面的代码将输出:
VarType:单身:5,双人5
来自System.pas
varSingle = $0004; { vt_r4 4 }
varDouble = $0005; { vt_r8 5 }
Run Code Online (Sandbox Code Playgroud)
因此,我希望VTSingle是4 - 而不是5
我错过了什么?
代数数据类型是准确描述数据的便捷方式。JSON 中的产品类型没有问题。但是,尚不清楚 sum-type 可以是什么,那么如何在 JSON 中表示变体类型?
我想使用lambdas和重载创建函数(例如)访问"递归" .std::variantboost::hana::overload
假设我有一个变量类型my_variant,可以存储一个a int,a float或a vector<my_variant>:
struct my_variant_wrapper;
using my_variant =
std::variant<int, float, std::vector<my_variant_wrapper>>;
struct my_variant_wrapper
{
my_variant _v;
};
Run Code Online (Sandbox Code Playgroud)
(我正在使用包装my_variant_wrapper类来递归地定义变体类型.)
我想以递归方式访问变体,根据存储的类型打印不同的东西.这是一个使用基于访问者的工作示例struct:
struct struct_visitor
{
void operator()(int x) const { std::cout << x << "i\n"; }
void operator()(float x) const { std::cout << x << "f\n"; }
void operator()(const std::vector<my_variant_wrapper>& x) const
{
for(const auto& y : x) std::visit(*this, y._v);
}
};
Run Code Online (Sandbox Code Playgroud)
std::visit使用上述访问者调用打印所需的输出: …
我有一种情况,函数必须返回从表中获取的值.此表中的单元格(假设表格正常工作......)可能包含值,或者可能不包含值.该值也可以是以下几种类型之一:( int, double, string, date但没有其他类型).
这样的函数会返回什么?回来是个好主意std::optional<std::variant<std::string, int, double, std::chrono::time_point>>吗?
那会是一个很好的使用optional和variant?
更新
我把这个问题缩小到(可能!它并不完全清楚,甚至可以阅读我能找到的关于该主题的所有内容)安装stdlibc++-7-dev将为我提供合适的(即符合C++ 17的)STL标头和库.
这(显然)也与Ubuntu 17.04(artful?)捆绑在一起,但不适用于xenial我正在使用的(Ubuntu 16.04.3 LTS).
我已经尝试下载单个.deb软件包并安装它们,但它很快就变成了一个未解决的依赖项迷宫.
如果有人能指出如何libstdc++-7-dev在16.04 安装,我将非常感激.
原始问题
我刚刚通过包管理器在Ubuntu 16.04中安装了clang ++ 6.0(遵循这些说明)并且一切看起来都很好:/usr/bin/clang++-6.0工作得很好,如果我尝试使用仅适用于C++ 17(non-type template arguments with auto见此处)的东西,它会编译并且一旦我设置,就会运行CMAKE_CXX_COMPILER=/usr/bin/clang++-6.0- 而当我没有运行时它会失败.
所以...... clang 6.0像宣传的那样理解C++ 17(doh!)但是当我使用时:
#include <variant>
Run Code Online (Sandbox Code Playgroud)
找不到我期望的文件:
$ ll /usr/include/clang/6.0.0/
total 0
lrwxrwxrwx 1 root root 45 Aug 6 21:32 include -> ../../../lib/llvm-6.0/lib/clang/6.0.0/include
Run Code Online (Sandbox Code Playgroud)
或者我能想到的任何其他地方.
是否有人知道(a)是否应该在那里和(b)如果是这样,我在哪里可以找到它?
更新
我仔细检查过我有最新的(我认为)stdc++库:
$ sudo apt-get install libstdc++-5-dev
Reading package lists... Done …Run Code Online (Sandbox Code Playgroud) 我可以定义一个玩具状态机(具有简单的输入),如下所示:
--------------------------------------------
-- module State where
data State = A | B Int
--------------------------------------------
-- module A where
-- import State
transitionA :: State
transitionA = B 10
--------------------------------------------
-- module B where
-- import State
transitionB :: Int -> State
transitionB i
| i < 0 = A
| otherwise = B (i-1)
--------------------------------------------
-- module StateMachine where
-- import State
-- import A
-- import B
transition :: State -> State
transition A = transitionA
transition (B i) …Run Code Online (Sandbox Code Playgroud) 我正在尝试访问变体的内容。我不知道里面有什么,但值得庆幸的是,变体确实可以。所以我想我只想问问变体它在什么索引上,然后将该索引用于std::get它的内容。
但这不能编译:
#include <variant>
int main()
{
std::variant<int, float, char> var { 42.0F };
const std::size_t idx = var.index();
auto res = std::get<idx>(var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误发生在std::get呼叫中:
error: no matching function for call to ‘get<idx>(std::variant<int, float, char>&)’
auto res = std::get<idx>(var);
^
In file included from /usr/include/c++/8/variant:37,
from main.cpp:1:
/usr/include/c++/8/utility:216:5: note: candidate: ‘template<long unsigned int _Int, class _Tp1, class _Tp2> constexpr typename std::tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type& std::get(std::pair<_Tp1, _Tp2>&)’
get(std::pair<_Tp1, _Tp2>& __in) noexcept
^~~
/usr/include/c++/8/utility:216:5: note: template …Run Code Online (Sandbox Code Playgroud)