Documentation

    Table of Content
    • CodePorting.Translator Product Family
      • CodePorting.Translator Cs2Cpp
        • Getting Started
          • Product Overview
          • Installation
          • Licensing
          • How to use CodePorting.Translator Cs2Cpp
            • How to Use Command line to translate and build Projects
            • How to Use GUI to translate and build Projects
        • Developer Guide
          • Translating Simple C# Projects
            • Translating Simple Console Application
            • Translating Simple Library
            • Translating Simple NUnit Test
          • Translating Dependent C# Projects
            • Translating Dependent Console Application
            • Translating Dependent Library
            • Translating Dependent NUnit Test
          • Qt support
          • Translating Complex C# Projects
            • How to Convert Complex C# Console Application to C++
            • How to Convert Complex C# Library to C++
            • How to Convert Complex C# NUnit Test to C++
          • What Converts to What
            • AbstractClasses
            • BreakStatements
            • ClassAutoProperties
            • ClassConstructors
            • ClassEvents
            • ClassFinalizers
            • ClassGenericMethods
            • ClassIndexers
            • ClassMethods
            • ClassProperties
            • ClassStaticConstructor
            • ClassStaticMethods
            • ClassStaticProperties
            • ClassVirtualMethods
            • ContinueStatements
            • Delegates
            • DoWhileStatements
            • Enums
            • EnumTypeCast
            • Exceptions
            • ExpectedException
            • ForeachStatements
            • ForeachStatementsStd
            • ForStatements
            • GenericClasses
            • GenericDelegates
            • GenericInterfaces
            • GenericStructs
            • IfStatements
            • LambdaExpressions
            • NestedClasses
            • ReturnStatements
            • SimpleClass
            • SimpleInterface
            • SimpleStruct
            • SimpleTest
            • StandardTypeCast
            • StaticClass
            • SwitchStatements
            • TestWithSetupMethods
            • ThrowStatements
            • TryCatchFinallyStatements
            • TryCatchStatements
            • TryFinallyStatements
            • VarExpressions
            • WhileStatements
          • CodePorting Translator Cs2Cpp Attributes
          • CodePorting Translator Cs2Cpp Configuration File
            • CodePorting.Translator Cs2Cpp Configuration File Structure
            • Attributes in Configuration file
            • Configuration file Nodes
            • Configuration file Options
          • Memory Management Model
            • Memory Management Model Description
            • Using aliasing constructor to create a smart pointer
          • Cmake Support
          • C++ code injection
          • C++ user-defined exception classes
          • Limitations and Bugs
            • Translator Limitations and Bugs
            • Library Limitations and Bugs
            • Cpp Code Injection
        • Release Notes
          • 2022
            • CodePorting.Translator Cs2Cpp 22.6
            • CodePorting.Native Cs2Cpp 22.5
            • CodePorting.Native Cs2Cpp 22.4
            • CodePorting.Native Cs2Cpp 22.3
            • CodePorting.Native Cs2Cpp 22.2
            • CodePorting.Native Cs2Cpp 22.1
          • 2021
            • CodePorting.Native Cs2Cpp 21.12
            • CodePorting.Native Cs2Cpp 21.11
            • CodePorting.Native Cs2Cpp 21.10.1
            • CodePorting.Native Cs2Cpp 21.10
            • CodePorting.Native Cs2Cpp 21.9
            • CodePorting.Native Cs2Cpp 21.8
            • CodePorting.Native Cs2Cpp 21.7
            • CodePorting.Native Cs2Cpp 21.6
            • CodePorting.Native Cs2Cpp 21.5
            • CodePorting.Native Cs2Cpp 21.4
            • CodePorting.Native Cs2Cpp 21.3
            • CodePorting.Native Cs2Cpp 21.2
            • CodePorting.Native Cs2Cpp 21.1
          • 2020
            • CodePorting.Native Cs2Cpp 20.12
            • CodePorting.Native Cs2Cpp 20.11
            • CodePorting.Native Cs2Cpp 20.10
            • CodePorting.Native Cs2Cpp 20.9
            • CodePorting.Native Cs2Cpp 20.8
            • CodePorting.Native Cs2Cpp 20.7
            • CodePorting.Native Cs2Cpp 20.6
            • CodePorting.Native Cs2Cpp 20.5
            • CodePorting.Native Cs2Cpp 20.4
            • CodePorting.Native Cs2Cpp 20.3
            • CodePorting.Native Cs2Cpp 20.2
            • CodePorting.Native Cs2Cpp 20.1
          • 2019
            • CodePorting.Native Cs2Cpp 19.1
            • CodePorting.Native Cs2Cpp 19.2
            • CodePorting.Native Cs2Cpp 19.3
            • CodePorting.Native Cs2Cpp 19.4
            • CodePorting.Native Cs2Cpp 19.4.1
            • CodePorting.Native Cs2Cpp 19.5
            • CodePorting.Native Cs2Cpp 19.6
            • CodePorting.Native Cs2Cpp 19.7
            • CodePorting.Native Cs2Cpp 19.8
            • CodePorting.Native Cs2Cpp 19.9
            • CodePorting.Native Cs2Cpp 19.10
            • CodePorting.Native Cs2Cpp 19.11
            • CodePorting.Native Cs2Cpp 19.12
          • 2018
            • CodePorting.Native Cs2Cpp 18.9
            • CodePorting.Native Cs2Cpp 18.9.1
            • CodePorting.Native Cs2Cpp 18.10
            • CodePorting.Native Cs2Cpp 18.11
            • CodePorting.Native Cs2Cpp 18.12
    1. Home
    2. CodePorting.Translator Product Family
    3. CodePorting.Translator Cs2Cpp
    4. Developer Guide
    5. What Converts to What
    6. ForeachStatementsStd

    ForeachStatementsStd

    What's on this Page

      • Source C# Code
      • Translated Code
        • C++ Header
        • C++ Source Code

    This example demonstrates standard way how foreach statement is translated to C++. It is translated to C++ while statement.

    Additional command-line options passed to CodePorting.Translator.Cs2Cpp: -o foreach_as_range_based_for_loop=false.

    Source C# Code

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using CodePorting.Translator.Cs2Cpp;
    
    namespace StatementsPorting
    {
        public struct TheStruct
        {
            public override string ToString()
            {
                return "The struct";
            }
        }
    
        public class TheClass
        {
            public override string ToString()
            {
                return "The class";
            }
        }
    
        public class ForeachStatementsStd
        {
            public void ForeachValueType_SingleStatement()
            {
                var structList = new List<TheStruct>() { new TheStruct() };
                foreach (var s in structList)
                    Console.WriteLine(s.ToString());
            }
    
            public void ForeachReferenceType_BlockStatement()
            {
                IList<TheClass> classList = new List<TheClass>() { new TheClass() };
                foreach (var c in classList)
                {
                    Console.WriteLine(c);
                }
            }
        }
    }

    Translated Code

    C++ Header

    #pragma once
    
    #include <system/string.h>
    
    namespace StatementsPorting {
    
    class TheStruct : public System::Object
    {
        typedef TheStruct ThisType;
        typedef System::Object BaseType;
        
        typedef ::System::BaseTypesInfo<BaseType> ThisTypeBaseTypesInfo;
        RTTI_INFO_DECL();
        
    public:
    
        TheStruct();
        
        System::String ToString() const override;
        
    private:
    
        System::String ToString_NonConst();
        
    };
    
    class TheClass : public System::Object
    {
        typedef TheClass ThisType;
        typedef System::Object BaseType;
        
        typedef ::System::BaseTypesInfo<BaseType> ThisTypeBaseTypesInfo;
        RTTI_INFO_DECL();
        
    public:
    
        System::String ToString() const override;
        
    private:
    
        System::String ToString_NonConst();
        
    };
    
    class ForeachStatementsStd : public System::Object
    {
        typedef ForeachStatementsStd ThisType;
        typedef System::Object BaseType;
        
        typedef ::System::BaseTypesInfo<BaseType> ThisTypeBaseTypesInfo;
        RTTI_INFO_DECL();
        
    public:
    
        void ForeachValueType_SingleStatement();
        void ForeachReferenceType_BlockStatement();
        
    };
    
    } // namespace StatementsPorting
    

    C++ Source Code

    #include "ForeachStatementsStd.h"
    
    #include <system/object_ext.h>
    #include <system/console.h>
    #include <system/collections/list.h>
    #include <system/collections/ilist.h>
    #include <system/collections/ienumerator.h>
    
    namespace StatementsPorting {
    
    RTTI_INFO_IMPL_HASH(2692051849u, ::StatementsPorting::TheStruct, ThisTypeBaseTypesInfo);
    
    System::String TheStruct::ToString_NonConst()
    {
        return u"The struct";
    }
    
    TheStruct::TheStruct()
    {
    }
    
    System::String TheStruct::ToString() const
    {
        using Type = typename std::remove_const<typename std::remove_reference<decltype(*this)>::type>::type;
        using TypePtr = typename std::add_pointer<Type>::type;
        return const_cast<TypePtr>(this)->ToString_NonConst();
    }
    
    RTTI_INFO_IMPL_HASH(548796836u, ::StatementsPorting::TheClass, ThisTypeBaseTypesInfo);
    
    System::String TheClass::ToString_NonConst()
    {
        return u"The class";
    }
    
    System::String TheClass::ToString() const
    {
        using Type = typename std::remove_const<typename std::remove_reference<decltype(*this)>::type>::type;
        using TypePtr = typename std::add_pointer<Type>::type;
        return const_cast<TypePtr>(this)->ToString_NonConst();
    }
    
    RTTI_INFO_IMPL_HASH(3070297266u, ::StatementsPorting::ForeachStatementsStd, ThisTypeBaseTypesInfo);
    
    void ForeachStatementsStd::ForeachValueType_SingleStatement()
    {
        auto structList = [&]{ StatementsPorting::TheStruct init_0[] = {TheStruct()}; auto list_0 = System::MakeObject<System::Collections::Generic::List<TheStruct>>(); list_0->AddInitializer(1, init_0); return list_0; }();
        
        {
            auto s_enumerator = (structList)->GetEnumerator();
            while (s_enumerator->MoveNext())
            {
                auto&& s = s_enumerator->get_Current();
                
                System::Console::WriteLine(System::ObjectExt::ToString(s));
            }
        }
    }
    
    void ForeachStatementsStd::ForeachReferenceType_BlockStatement()
    {
        System::SharedPtr<System::Collections::Generic::IList<System::SharedPtr<TheClass>>> classList = [&]{ System::SharedPtr<StatementsPorting::TheClass> init_1[] = {System::MakeObject<TheClass>()}; auto list_1 = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<TheClass>>>(); list_1->AddInitializer(1, init_1); return list_1; }();
        
        {
            auto c_enumerator = (classList)->GetEnumerator();
            while (c_enumerator->MoveNext())
            {
                auto&& c = c_enumerator->get_Current();
                
                System::Console::WriteLine(c);
            }
        }
    }
    
    } // namespace StatementsPorting