标签: variant

返回未知类型的函数

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:我正在尝试寻找一种替代方法来返回包含这些数据类型的结构/联合.

c++ variant visual-c++-2005

8
推荐指数
3
解决办法
8575
查看次数

boost :: variant <T>到std :: string

我有一个看起来像这样的提升变体: typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;

我需要能够将此变体中的任何值转换为std :: string,我想知道是否有一些我可以使用的模板类型函数来执行此操作?

或者最有效的方法是什么?

我目前正在实现一堆重载函数,每个函数都采用一种类型,然后使用std::stringstream或进行转换,posix_time我会使用它的转换函数.也许有更好的方法?

c++ string variant

8
推荐指数
1
解决办法
3974
查看次数

将字符串转换为c ++中的变体

我有这个当前代码,它将"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)

c++ variant visual-studio-2010 visual-c++

8
推荐指数
1
解决办法
6961
查看次数

为什么在varDouble变体中为变量分配单个结果?

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
我错过了什么?

delphi variant

8
推荐指数
1
解决办法
943
查看次数

如何在 JSON 中表示变体(和类型)?

代数数据类型是准确描述数据的便捷方式。JSON 中的产品类型没有问题。但是,尚不清楚 sum-type 可以是什么,那么如何在 JSON 中表示变体类型

json functional-programming variant

8
推荐指数
2
解决办法
747
查看次数

使用lambdas和定点组合器递归访问`std :: variant`

我想使用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使用上述访问者调用打印所需的输出: …

c++ lambda variant boost-hana c++17

8
推荐指数
1
解决办法
1187
查看次数

返回类型std :: optional <std :: variant <... >>

我有一种情况,函数必须返回从表中获取的值.此表中的单元格(假设表格正常工作......)可能包含值,或者可能不包含值.该值也可以是以下几种类型之一:( int, double, string, date但没有其他类型).

这样的函数会返回什么?回来是个好主意std::optional<std::variant<std::string, int, double, std::chrono::time_point>>吗?

那会是一个很好的使用optionalvariant

c++ variant optional c++17

8
推荐指数
1
解决办法
1314
查看次数

C++ 17 std :: variant头文件(clang 6.0.0)

更新

我把这个问题缩小到(可能!它并不完全清楚,甚至可以阅读我能找到的关于该主题的所有内容)安装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)

c++ clang variant c++17

8
推荐指数
1
解决办法
3869
查看次数

Haskell中的可扩展状态机

我可以定义一个玩具状态机(具有简单的输入),如下所示:

--------------------------------------------
-- 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)

haskell variant fsm

8
推荐指数
1
解决办法
218
查看次数

为什么不能检索变体的索引并使用它来获取其内容?

我正在尝试访问变体的内容。我不知道里面有什么,但值得庆幸的是,变体确实可以。所以我想我只想问问变体它在什么索引上,然后将该索引用于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)

c++ variant c++17

8
推荐指数
2
解决办法
122
查看次数