6

型のサイズを使用してパラメーターの値パスまたは参照パスを選択する方法を覚えているようです。

何かのようなもの:

void fun( check<A> a ){
    ...
}

生成または:

void fun( A a ){
    ...
}

また

void fun( A & a ){
    ...
}

タイプ A のサイズと、アプリケーションをコンパイルするアーキテクチャによって異なります。

4

2 に答える 2

13

C++11 では、以下を使用できますstd::conditional

#include <type_traits>

class A { ... };

typedef std::conditional<
   std::is_trivially_copyable<A>::value && sizeof(A) <= sizeof(int),
   A, const A&>::type AParam;

// Direct usage
void f(AParam param);

// Wrap into template class
template <typename T> struct check:
   std::conditional<std::is_arithmetic<T>::value, T, const T&> {};

void f(check<A>::type param);

C++03 コンパイラの場合、Boost implementation - Boost.TypeTraits libraryを使用できます。

@sehe が述べたように、必要な機能を正しく実装するBoost.CallTraits ライブラリもあります。

#include <boost/call_traits.hpp>

class A { ... };

void f(boost::call_traits<A>::param_type param);
于 2012-10-05T19:02:42.003 に答える
6

あなたが説明するものは直接存在しません(少なくとも、標準ではありません)

編集OPがおそらく参照していたものを見つけました:

0.通話特性を高める

call_traits<T>::param_typeOpが念頭に置いていた/覚えていたものである可能性があります:

template<typename T> 
   using check = typename boost::call_traits<T>::param_type;

void f(check<A> param);

型 T のパラメーターを関数に渡す "最良の" 方法を表す型を定義します。

次の表は、call_traits がさまざまな型に与える影響を示しています。この表は、コンパイラが部分的な特殊化をサポートしていることを前提としています。サポートされていない場合、すべての型は「myclass」のエントリと同じように動作し、call_traits は使用できません。参照型または配列型。 ここに画像の説明を入力

AFAICTの2つの 3つのことを指している可能性があります。

1.rvalue参考文献

移動セマンティクスを最適化できるという意味だと想像できます。例えば:

struct Demo
{
     Demo(std::string&& tomove) : _s(std::move(tomove)) { }
   private:
     std::string _s;
};

こちらです、

 std::string a_very_large_string;
 Demo moving(std::move(a_very_large_string)); // prevents a copy

2. 完全転送:

完全転送は、一般的な状況に適用されるのと同じ原則です。

#include <tuple>
#include <string>
#include <vector>

typedef unsigned int uint;

template <typename... T>
void AnotherDemo(T... args)
{
    std::tuple<T...> perfect(std::forward<T>(args)...); // optimal

    // more code using perfect, passing it by reference etc.
}

int main(int argc, const char *argv[])
{
    AnotherDemo(std::string("moved")); // moved
    AnotherDemo(42);                   // copied

    std::vector<double> v { 1,2,3 };
    AnotherDemo(v);                    // copied
    AnotherDemo(std::move(v));         // moved
}

3. メタプログラミング:

@Rostの回答に基づいて、メタプログラミングを使用してこれを実現できます。

例:テンプレート エイリアスを使用する:

#include <type_traits>

template<typename T> 
   using check = typename boost::call_traits<T>::param_type;

void f(check<A> param);
于 2012-10-05T18:59:16.543 に答える