2013-08-05 34 views
1

這個問題建立了我的C++ 11:模板類方法內聯聲明的任何更簡單的方法?

C++ library: .hpp + .inl (separate definitions and declarations) vs .hpp only (in-class body code)

移動模板的功能集成到嵌入式文件肯定是一個正式的地獄。請看下面的三個例子。從我老練的方式(#0),到真正擴展的方式(#1),到更緊湊的方式(#2)到想象中的夢想管道(#3)。

// #0 the actual class definition 
namespace CA { 
    template <typename tnChar> 
    class MyClass { 
    public: 
     typedef tnChar      tChar; 
     typedef std::basic_string<tChar> tString; 
     MyClass(); // {} 
     tString Method1(const tString& aParam) const; // { return aParam; } 
    }; 
}; 

這是內聯版本#1。它有名稱空間和類。

template <typename tnChar> 
CA::MyClass<tnChar>::MyClass(){} 

template <typename tnChar> 
typename CA::MyClass<tnChar>::tString 
CA::MyClass<tnChar>::Method1(const tString& aParam) const { 
    return aParam; 
} 

template <> // specializing 
typename CA::MyClass<wchar_t>::tString 
CA::MyClass<wchar_t>::Method1(const tString& aParam) const { 
    return aParam; 
} 

這是內聯版本#2。它被封裝在命名空間中。從添加CA::保存。

namespace CA { 
    template <typename tnChar> 
    MyClass<tnChar>::MyClass(){} 

    template <typename tnChar> 
    typename MyClass<tnChar>::tString 
    MyClass<tnChar>::Method1(const tString& aParam) const { 
     return aParam; 
    } 

    template <> // specializing 
    typename MyClass<wchar_t>::tString 
    MyClass<wchar_t>::Method1(const tString& aParam) const { 
     return aParam; 
    } 
} 

這是內聯#3型。它被包裝在命名空間和類中。從添加template <...> ... CA::MyClass保存。 IMAGINARY版本。不可能但希望!

#if 0 // like this is ever gonna work 
// inline version #3 (IMAGINARY) 
// wrapped in namespace and in class 
// 'inline class' should make this functionality happen in C++my 
namespace CA { 
    template <typename tnChar> 
    inline class MyClass { // :) 
     MyClass(){} 

     tString Method1(const tString& aParam) const { 
      return aParam; 
     } 
    }; 

    template <> 
    inline class MyClass<wchar_t> { // :) - too much imagination 
     tString Method1(const tString& aParam) const { 
      return aParam; 
     } 
    }; 
} 
#endif // disabled 

我的問題是:就好像是第3版,甚至任何遠程可能嗎?無需typename返回值並每次寫入template <...>。我知道我們需要這樣做的原因,但我想知道新的C++11或下一個C++14是否有任何計劃地址模板類內聯方法分組

具有inline class關鍵字觸發#3的假想功能將是令人興奮的,它將使外部化模板類的方法很容易...和邏輯......並分組...和短:)

+0

'auto'關鍵字會這樣做嗎?我*想*我已經看到'auto'返回類型,但我可能會誤解。 – Suedocode

+0

@Aggieboy MSVC在追趕東西方面很慢...'auto'返回...還沒有!不要認爲這適用於此。 – CodeAngry

+0

@Aggieboy一個有趣的提示,尾隨返回類型確實在該類的範圍內。 – dyp

回答

1

在聲明顯而易見的風險時,在類體內聲明成員函數時可以使用該語法。如果您的宗教信息要求您將成員函數放在單獨的.inl文件中,那麼您可以將該文件包含在類體中。

+0

**確定。**這是一個很好的黑客! – CodeAngry